基礎
変数と型
val(不変)を var(可変)より優先してください。Kotlin は型を推論しますが明示的なアノテーションも許可します。型チェックには 'is' を使用します(自動的にスマートキャスト)。Kotlin 構文ではすべてがオブジェクトです—プリミティブはありません。
val name = "Alice" // immutable (preferred)
var age = 30 // mutable
val pi: Double = 3.14159
val isDev: Boolean = true
val nums: List<Int> = listOf(1, 2, 3)
println(name::class) // class kotlin.String
println(age is Int) // true文字列テンプレート
単純な変数には $var、式には ${expr} を使用します。三重引用符文字列は改行を保持します—きれいなフォーマットのために trimIndent() を使用します。文字列テンプレートによりフォーマット文字列なしで文字列構築が簡潔で読みやすくなります。
val name = "Alice"
val age = 30
println("Name: $name, Age: $age") // simple var
println("Length: ${name.length}") // expression
println("Upper: ${name.uppercase()}")
val multiline = """
Hello, $name
Age: $age
""".trimIndent()Null 安全性
Kotlin の null 安全性:? が nullable 型をマーク、?. がセーフコール(null の場合 null を返す)、!! が非 null を表明(null の場合 NPE をスロー)、?: が elvis(null の場合デフォルト)。これによりコンパイル時に NullPointerException を排除します—Kotlin のコア機能です。
var name: String? = null // nullable type
println(name?.length) // null (safe call)
name = "Alice"
println(name!!.length) // 5 (non-null assertion)
val len: Int = name?.length ?: 0 // elvis operator
// Non-null types can never be null
val s: String = "hi" // not nullable型変換
Kotlin は明示的な型変換を要求します(Java のような暗黙の拡大なし)。変換には toInt()/toDouble()/toString() を使用します。toIntOrNull() は失敗時に null を返します—例外を投げる toInt() より安全です。解析からの null を常に処理してください。
val n: Int = 42
val d: Double = n.toDouble()
val s: String = n.toString()
val fromStr: Int? = "100".toIntOrNull()
val invalid: Int? = "abc".toIntOrNull() // null
println(d, s, fromStr, invalid)型チェックとスマートキャスト
is が型をチェックし、そのブランチで変数をスマートキャストします—明示的なキャストは不要です。!is が否定です。安全でないキャストには as を(ClassCastException をスロー)、安全なキャストには as? を使用します(失敗時に null を返す)。スマートキャストは Kotlin の主要な利便性です。
fun describe(x: Any): String =
when (x) {
is Int -> "Int: ${x + 1}" // x smart-cast to Int
is String -> "String of length ${x.length}"
is List<*> -> "List with ${x.size} items"
else -> "Unknown"
}
println(describe(42)) // Int: 43
println(describe("hello")) // String of length 5文字列
一般的な文字列メソッド
Kotlin の文字列は標準ライブラリからの豊富な拡張関数を持ちます。ほとんどは新しい文字列を返します(不変)。手動ループの代わりにこれらを使用してください。uppercase() のような関数はロケール対応です—一貫した結果のために uppercase(Locale.ROOT) を使用します。
val s = "Hello, World"
println(s.length) // 12
println(s.uppercase()) // HELLO, WORLD
println(s.lowercase()) // hello, world
println(s.split(", ")) // [Hello, World]
println(s.replace("o", "0")) // Hell0, W0rld
println(s.reversed()) // dlroW ,olleH
println(s.startsWith("Hello")) // true複数行と Raw 文字列
三重引用符文字列は raw です—エスケープシーケンスは不要です(三重二重引用符を除く)。trimMargin('|') は | の後のテキストのみを保持し、きれいなインデントにします。trimIndent() は共通の空白を削除します。SQL、JSON、HTML コードに最適です。
val text = """
|Hello,
|World!
""".trimMargin() // | marks line start
println(text)
val json = """{"name": "Alice", "age": 30}"""
println(json) // no escape needed for quotes
// trimIndent() removes common leading whitespace文字列構築
joinToString がセパレータ、プレフィックス、ポストフィックス付きでコレクションを結合する慣用的な方法です。buildString が簡潔な構築のために StringBuilder スコープを提供します。ループ内での + の繰り返しは避けてください—効率のために joinToString または StringBuilder を使用します。
val parts = listOf("apple", "banana", "cherry")
println(parts.joinToString(", ")) // apple, banana, cherry
println(parts.joinToString(prefix="[", postfix="]"))
val sb = StringBuilder()
for (p in parts) sb.append(p).append(" ")
println(sb.toString().trim())
// buildString for concise building
val result = buildString {
parts.forEach { append(it).append(";") }
}文字列から数値へ
toInt()/toDouble() は無効な入力で NumberFormatException をスローします。toIntOrNull() は null を返します—安全なデフォルトのために ?: と組み合わせます。toBooleanStrict() は 'true'/'false' のみを受け入れます。ユーザー入力や信頼できないデータには OrNull バリアントを使用します。