Menu
Coddy logo textTech

Kotlin チートシート

最終更新

Hello World と基本

Kotlin プログラムはトップレベルの main 関数から始まります。クラスは不要です。

構文意味
fun main() { println("Hello") }プログラムのエントリポイント
println("text")標準出力に1行出力する
print("text")末尾の改行なしで出力する
// comment1行コメント
/* comment */複数行コメント
val input = readLine()stdin から1行読む (nullable な String?)
val line = readln()stdin から1行読む (非 null、Kotlin 1.6+)

変数 (val / var) と型

val を優先し、値が変わる必要があるときだけ var を使う。

構文意味
val name = "Ada"読み取り専用の変数、型は String と推論される
var count = 0可変の変数
val age: Int = 30明示的な型注釈
Int, Long, Double, Float数値型 (42, 42L, 3.14, 3.14f)
Boolean, Char, Stringtrue/false, 'a', "text"
val big = 1_000_000読みやすいリテラルのためのアンダースコア
"3".toInt(), "2.5".toDouble()文字列を数値に変換する
42.toString()数値を文字列に
const val MAX = 10コンパイル時定数 (トップレベルまたは object 内)

文字列とテンプレート

文字列テンプレートはほぼすべての場面で連結の代わりになります。

構文意味
"Hi, $name"文字列に変数を埋め込む
"Total: ${price * qty}"式を埋め込む
s.length文字数
s.uppercase(), s.lowercase()大文字・小文字を変える
s.trim()前後の空白を取り除く
s.contains("x"), s.startsWith("a")文字列内を検索する
s.substring(0, 3)インデックス範囲で切り出す
s.split(",")List<String> に分割する
s[0]指定インデックスの文字
"""raw text"""エスケープ不要の複数行生文字列
"%.2f".format(3.14159)書式付き出力 (3.14)

null安全

型はデフォルトで非 null。? を付けると null を許容し、コンパイラがその処理を強制します。

構文意味
var s: String? = nullnullable な型
s?.length安全呼び出し: snull なら null を返す
s?.length ?: 0エルビス演算子: null のときの代替値
s!!.length非 null アサーション: snull なら例外を投げる
if (s != null) s.lengthチェック内で非 null にスマートキャスト
s?.let { println(it) }null でないときだけブロックを実行
val n = s?.toIntOrNull()変換し、不正な入力なら null
lateinit var x: String後から初期化する非 null の var

演算子

演算子意味
+ - * / %算術演算 (Int 同士の / は整数除算)
+= -= *= /= %=複合代入
++ --インクリメント / デクリメント
== !=構造的等価 (equals を呼ぶ)
=== !==参照等価 (同じオブジェクト)
< > <= >=比較
&& || !論理積 / 論理和 / 否定
a in 1..10範囲またはコレクションへの所属
x as Int, x as? Intキャスト / 安全なキャスト (失敗時は null)
x is String型チェック (成功時はスマートキャスト)

制御フロー (if / when)

ifwhen は式であり、値を返します。

構文意味
if (a > b) x else y式としての if (Kotlin に三項演算子 ?: はない)
if (c) { ... } else if (d) { ... } else { ... }連鎖する分岐
when (x) { 1 -> "one"; 2 -> "two"; else -> "other" }値と照合する
when (x) { 1, 2 -> "low" }1つの分岐に複数の値
when (x) { in 1..9 -> "digit" }範囲と照合する
when (x) { is String -> x.length }型と照合する (スマートキャスト付き)
when { x < 0 -> "neg"; x == 0 -> "zero"; else -> "pos" }対象なしの whenif/else if と同様
val label = when (x) { ... }式としての when (else が必要)

ループと範囲

構文意味
for (i in 1..5)1 から 5 までの閉区間
for (i in 1 until 5)1 から 4 まで (終端を含まない)
for (i in 0..<5)同じ、終端を含まない範囲の構文 (Kotlin 1.9+)
for (i in 10 downTo 1 step 2)ステップ付きでカウントダウン
for (item in list)コレクションを反復する
for ((i, item) in list.withIndex())インデックスと要素を同時に
for (ch in "abc")文字列の文字を反復する
while (cond) { ... }真である間ループする
do { ... } while (cond)少なくとも1回実行する
break, continueループを抜ける / 次の反復へ進む
repeat(3) { println(it) }ブロックを n 回実行する

関数

構文意味
fun add(a: Int, b: Int): Int { return a + b }関数を宣言する
fun add(a: Int, b: Int) = a + b単一式関数、戻り値の型は推論される
fun greet(name: String = "world")パラメータのデフォルト値
greet(name = "Ada")名前付き引数
fun log(vararg items: String)可変長引数
fun say(): Unit戻り値なし (Unit は省略可)
val square = { x: Int -> x * x }変数に格納したラムダ
fun String.shout() = uppercase() + "!"拡張関数
fun apply(f: (Int) -> Int) = f(2)パラメータとしての関数
list.map { it * 2 }末尾ラムダ、it が唯一のパラメータ

リスト

listOf は読み取り専用、mutableListOf は変更可能。

構文意味
val nums = listOf(1, 2, 3)読み取り専用リスト
val items = mutableListOf("a")可変リスト
nums[0], nums.first(), nums.last()要素にアクセスする
nums.getOrNull(9)安全なアクセス、範囲外なら null
items.add("b"), items.remove("a")追加 / 削除
items[0] = "z"インデックスで置き換える
nums.size, nums.isEmpty()サイズと空かどうか
x in nums, nums.contains(x)所属
nums.indexOf(2)要素の位置、なければ -1
nums.subList(0, 2)部分リスト (終端を含まない)
nums.take(2), nums.drop(1)先頭 n 個 / 先頭 n 個を除く全部
nums.sorted(), nums.reversed()ソート済み / 逆順の新しいリスト
nums.sum(), nums.average(), nums.maxOrNull()集計
nums.joinToString(", ")1つの文字列に結合する
Pair(1, "a"), 1 to "a", Triple(1, 2, 3)小さな固定長タプル

マップとセット

構文意味
val m = mapOf("a" to 1, "b" to 2)読み取り専用マップ
val mm = mutableMapOf<String, Int>()可変マップ
m["a"]検索 (なければ null)
m.getOrDefault("z", 0)代替値付きの検索
mm["c"] = 3挿入または更新
for ((k, v) in m)分解宣言でエントリを反復する
m.keys, m.valuesキー / 値のコレクション
"a" in mキーの存在
val s = setOf(1, 2, 2)一意な値のセット ({1, 2})
mutableSetOf<Int>()可変セット

コレクション操作 (ラムダ)

構文意味
list.map { it * 2 }各要素を変換する
list.filter { it > 2 }条件に合う要素だけ残す
list.forEach { println(it) }各要素に対して処理する
list.any { it > 2 }, list.all { it > 0 }いずれか / すべての要素が条件を満たすか
list.count { it % 2 == 0 }一致数を数える
list.find { it > 2 }最初の一致または null
list.sortedBy { it.length }キーでソートする
list.groupBy { it.first() }Map にグループ化する
list.distinct()重複を取り除く
list.fold(0) { acc, x -> acc + x }初期値付きで畳み込む
list.zip(other)2つのリストをペアにする
list.flatMap { it.toList() }変換してから平坦化する

クラスとデータクラス

構文意味
class User(val name: String, var age: Int)プライマリコンストラクタとプロパティを持つクラス
val u = User("Ada", 36)インスタンスを生成する (new 不要)
u.name, u.age = 37プロパティの読み書き
data class Point(val x: Int, val y: Int)equals, hashCode, toString, copy が自動生成
p.copy(y = 5)一部のプロパティを変えてコピー
val (x, y) = p分解宣言
open class Base, class Sub : Base()継承 (クラスはデフォルトで final)
override fun toString() = "..."メンバをオーバーライドする
object Config { val debug = true }シングルトン
companion object { fun create() = User("", 0) }静的メンバ相当
enum class Color { RED, GREEN }列挙型
sealed class Result制限されたクラス階層、when で網羅的
interface Shape { fun area(): Double }インターフェース

エラー処理

構文意味
try { ... } catch (e: Exception) { ... }例外を捕捉する
try { ... } finally { ... }必ず後処理を実行する
val n = try { s.toInt() } catch (e: NumberFormatException) { 0 }式としての try
throw IllegalArgumentException("bad")例外を投げる
require(x > 0) { "x must be positive" }引数チェック (IllegalArgumentException を投げる)
check(ready) { "not ready" }状態チェック (IllegalStateException を投げる)
s.toIntOrNull()例外の代わりに null を返す
runCatching { risky() }.getOrDefault(0)呼び出しを Result で包む

スコープ関数

ブロック内でオブジェクトを扱うための5つの小さなヘルパー。

構文意味
x.let { it + 1 }it がオブジェクト、ブロックの結果を返す
x.run { this + 1 }this がオブジェクト、ブロックの結果を返す
x.apply { field = 1 }this がオブジェクト、オブジェクト自身を返す
x.also { println(it) }it がオブジェクト、オブジェクト自身を返す
with(x) { field }拡張関数ではない。thisx、ブロックの結果を返す
x?.let { ... }慣用的な null チェック + 利用

探している Kotlin の構文をすべて1ページに。この Kotlin チートシートは、Android と現代の JVM の多くを支える言語のクイックリファレンスです。変数の宣言、null の安全な扱い、when による分岐、範囲のループ、関数の記述、リストとマップの操作をまとめました。

ここにあるのはすべて標準の Kotlin で、JVM でも Android でも Kotlin Multiplatform でも同じように動きます。必要な部分をコピーするか、Kotlin プレイグラウンドでそのまま試してください。スニペットを貼り付けて Run を押せば、ブラウザで出力を確認できます。

Kotlin チートシート FAQ

この Kotlin チートシートは無料ですか?
はい。この Kotlin チートシートは完全に無料で、登録も不要です。ブックマークして、when の分岐や null安全の演算子、コレクションのメソッドを確認したいときにいつでも戻ってきてください。
Kotlin の val と var の違いは何ですか?
val は読み取り専用の参照を宣言します。一度代入したら再代入できません。var は再代入できる可変の変数を宣言します。ただし val が固定するのは参照だけで、val list = mutableListOf(1) には要素を追加できます。Kotlin のスタイルはどこでも val を使い、本当に再代入が必要なときだけ var に切り替えることです。
Kotlin の null安全はどう動きますか?
型はデフォルトで非 null なので、String は決して null を持てず、String? は持てます。コンパイラは null の場合を処理しないまま nullable な値のメソッドを呼ぶことを許しません。安全呼び出し (s?.length)、エルビス演算子による代替値 (s?.length ?: 0)、スマートキャストを伴う null チェック (if (s != null))、そして最後の手段として、値が本当に null なら NullPointerException を投げる非 null アサーション s!! があります。
Kotlin で if の代わりに when を使うのはいつですか?
1つの値を複数の候補 (定数、範囲、型、またはその組み合わせ) と比較するときは when、単一の yes/no 条件には if/else を使います。どちらも式なので、val label = when (x) { ... }val label = if (c) a else b も慣用的です。式として使う when は網羅的でなければならず、通常は else 分岐を追加します (sealed クラスと enum は else なしでも網羅的にできます)。
Kotlin をオンラインで練習できますか?
はい。Kotlin プレイグラウンドを開けば、このチートシートのどのスニペットもブラウザで実行できます。JDK や IntelliJ のインストールは不要です。体系的に学びたくなったら、Coddy の無料インタラクティブ Kotlin コースが Hello World から null安全、when、ループ、関数、コレクションまで導き、最後に無料の証明書を発行します。
Coddy programming languages illustration

CoddyでKotlinを学ぼう

始める