基本文法その2 Kotlin(-script)の場合

kotlinc -scriptで実行するスクリプトです(末尾のmain()を削れば通常のKotlinソースになると思います)。

import java.io.File

// ◆デフォルト引数を持つ関数の定義
//   処理の記述はBeanShell(Java)と全く同じ
fun getFileNames(dir: String, ext: String=""): ArrayList<String> {
    val d = File(dir)
    val files: ArrayList<String> = ArrayList<String>()
    d.listFiles().forEach {
        if(it.isFile() && (ext == "" || it.name.endsWith(ext))){ files.add(it.name) }
    }
    return files
}

// ◆可変長引数を持つ関数の定義。varargを付けて引数を宣言する
fun getSum(vararg nums: Int): Int {
    var sum : Int = 0
    nums.forEach{ sum += it }
    return sum
}

fun main(){
    // ◆文字列から"b"の文字が最初に現れる位置(先頭が0)を得る
    val a = "orange melon strawberry grape"
    val n = a.indexOf("b")
    println("${n}")

    // ◆その位置から5文字を切り出す
    val b = a.substring(n, n+5)
    // berry
    println(b)

    // ◆文字列の一部置き換え
    println(a.replace("mel", "lem"))

    // ◆数値と文字列をそれぞれ加算、文字列連結する
    // Pythonと同じ。数値のデータ型が異なる変数は+できない。必ず型変換が必要
    val v1 = 10.2
    val v2 = "15.3"
    // 25.5 10.215.3 25.5 15.310.2
    val v3 = v1 + v2.toDouble()
    // 文字列+数値は暗黙に文字列連結になるが、数値+文字列はNG。明示的な変換が必要
    val v4 = v1.toString() + v2
    val v5 = v2.toDouble() + v1
    // 文字列+数値は暗黙に文字列連結になるので、以下はどちらでもOK
    //val v6 = v2 + v1.toString()
    val v6 = v2 + v1
    println("${v3} ${v4} ${v5} ${v6}")

    // ◆配列の3番目の要素から3個を取り出し、文字列に連結して出力する
    val arr = arrayOf("orange", "melon", "strawberry", "grape", "apple", "banana")
    val arrsub = arr.slice(2 .. 2+3-1)
    // strawberry grape apple
    println(arrsub.joinToString(" "))

    // ◆要素の追加。配列やtoList()で変換できるListでは要素を追加できない。
    //   MutableListに変換する
    //   ちなみにMutableListとArrayListは別物なので相互に代入はできない
    val mlist : MutableList<String> = arr.toMutableList()
    mlist.add("peach")

    // ◆要素の検索。indextOfは配列にも〜Listにも使える
    //println(arr.indexOf("apple"))
    println("index of 'peach' is:" + mlist.indexOf("peach"))

    // ◆配列要素を変数に一括代入する
    val (e1, e2, e3) = arrsub
    println("${e1} ${e2} ${e3}")
    // ちなみにデータ型を付けるならこうする必要がある
    // val (e1: String, e2: String, e3: String) = arrsub

    // mapOfで作成すると要素を後から追加できない。mutableMapOfで作成する
    val harr = mutableMapOf("orange" to 80, "melon" to 1200, "strawberry" to 350)
    harr["grape"] = 450
    // ◆配列キーの存在有無をチェックする
    // yes
    println(if(harr["melon"] == null) "no" else "yes")
    // no
    println(if(harr["lemon"] == null) "no" else "yes")

    // ◆配列キー一覧をソートして、キーと値を出力する
    harr.toSortedMap().forEach { k,v -> println("${k}\t${v}") }

    // ◆デフォルト引数を持つ関数を使う
    println(getFileNames(".").joinToString())
    println(getFileNames(".", ".txt").joinToString())

    // ◆可変長引数を持つ関数を使う
    println(getSum(10,11,12,13))
}

main()