Androidアプリ開発言語として注目を集めるKotlinの、
スクリプトモード(kotlinc -script)のサンプルプログラムです。
基本文法の範囲には、Kotlinの特徴である厳しいnullチェックや静的型付けの影響はさほど出てきません。
それよりも、文字列やリストや配列の長さを取得するのはlengthかsizeか、それともlength()か?
と今も混乱します。
/*============================*
* 複数行のコメントは
* このように
* 書けます。
*============================*/
// 1行コメントはこのように書けます。
// Java同様、importは必ず先頭に置かなければならない。
// 途中に置くと expecting an element というエラーになる
import java.util.regex.*
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
println("Hello, World.")
println("こんにちは。")
val var1 = 42
var var2 = 35 // 再代入がある変数はvarで宣言
var var3 = var1 + var2 // インクリメントする変数もvar必須
var var4 = var1 - var2
println("結果は${var3}と${var4}")
val msg = "結果は" + var3.toString() + "と" + var4.toString()
println(msg)
// C言語式の代入とインクリメント演算子もある
var2 += 18
var3--
var4++
println("${var2} ${var3} ${var4}")
// 配列/リストはarrayOf, listOf, mapOfなどで作れる。
// ここではintの配列。arrayOf<Int>よりもboxingが高速らしい
// またint,doubleではなくInt,Doubleなので注意
// 初期化時の値は 42 53 76 8
val arr1 = intArrayOf(var1, var2, var3, var4)
// 分岐と反復
for(v in arr1){
if(v >= 50){
println(v.toString() + "は50以上です。")
} else if(v >= 40 && v < 50){
println(v.toString() + "は40以上50未満です。")
} else {
println(v.toString() + "は50未満です。")
}
}
// 普通のfor文は無い。
// 1..10は1から10まで(10も含む)。Pythonと違うので注意
// Kotlinの配列の長さはlengthではなくsize
// ループ変数iにはvarもvalもつける必要はない
var var5 = 1
for(i in 0 .. arr1.size-1){
var5 *= arr1[i]
}
// 整形出力。formatの書式はCやJavaに似ているが、
// ,を入れるとカンマ区切りになるのはPythonやPowerShellと共通
// ただし、,の位置が特殊なので注意。-や桁数指定よりも左でないといけない
// また-で左詰めにしたとき、整数部が多すぎる場合末尾に空白が含まれるので注意
// 整数部が足りない場合は表示に必要なだけ拡張される
// (下記の例では整数部が5桁で切られてしまうことはない)
println("%,-5.2f".format(var5.toDouble()))
println("計算結果:[%,15.2f]".format(var5.toDouble()))
val str1 = "Hello,Power,Shell,World"
// lengthに括弧は不要
println("文字列の長さは" + str1.length.toString())
// 大文字に変換
println(str1.toUpperCase())
// 配列の分割はJavaのString#split()を使う
val arr2 = str1.split(",")
// 配列を表示
println(arr2)
// Javaの正規表現。Matcher.matches()は文字列全体、find()は部分一致で真
val p = Pattern.compile("^.[opqr]") // 2文字目がopqrのいずれか
for(v in arr2){
// Kotlinのif文は式なので値を返す。下記の書き方ができる
val result = if(p.matcher(v).find()) "す" else "せん"
println("${v}はマッチしま${result}。")
}
// 現在時刻の取得
// DateやDateFormatではなく新しいjava.time.*を使用
val df1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")
val dstr1 = df1.format(LocalDateTime.now())
// 指定した年月日の値を取得
val df2 = DateTimeFormatter.ofPattern("yyyy/MM/dd")
val dstr2 = df2.format(LocalDateTime.of(2020, 4, 26, 0, 0, 0))
// ヒアドキュメント。"""の直後/直前で改行すると改行文字も入る点に注意
val s = """現在時刻は${dstr1}です。
特定の日付とは…${dstr2}です。"""
println(s)
// end.