Kotlinプログラミングについて個人的にまとめたものです。内容には間違いが含まれている場合があります。
文法
ジャンプ
関数
インライン化
クラス
シングルトン
classの代わりにobjectを用いてクラスを宣言する- インスタンスはクラス名と同じ名前を持つ
- インスタンスは初回アクセス時にスレッドセーフな方法で生成される
静的メンバ
companion objectを用いて内部クラスを宣言する- このクラス名は省略できる
- 定義したメンバは外側のクラス名でアクセスできる
class Foo {
companion object {
fun bar() = 42
}
}
Foo.bar() // => 42無名オブジェクト
- クラスの宣言とインスタンスの生成を式中で行うことができる
- 宣言したクラスは名前を持たない
open class Foo(val v: Int)
val obj = object : Foo(42) {
fun bar() = v
}
obj.bar() // => 42ラムダ式
https://kotlinlang.org/docs/lambdas.html
- 戻り値は最後の式の値
- 型は推論される
- 引数の型は推論できる
- 引数が1つならば引数宣言を省略できる
- その場合は
itが暗黙的に宣言される
- その場合は
- ラムダ式からのリターンを行うにはラベルを付ける必要がある
- ラベルなし
returnは関数を抜けるときに使われる
- ラベルなし
val lambda1: (Int) -> Int = { x: Int -> x * x } // 基本形
val lambda2: (Int) -> Int = { x -> x * x } // 型を省略
val lambda3: (Int) -> Int = { it * it } // 引数宣言を省略
val lambda4: (Int) -> Int = label@ { return@label it * it } // ラベル付きリターン無名関数
null安全性
- 通常の変数は
nullを代入できない - 変数をnullable(nullを代入可能)にしたい場合、型の末尾に
?を付ける - nullableな変数のメンバにアクセスするには
?.を使う- その戻り値はnullableになる
- 変数がnullであった場合、メンバアクセスは行われずにnullが返る
- nullでないことが文法上明らかな場合、その範囲内では通常の変数として扱われる
- 変数の末尾に
!!をつけると通常の変数として扱われる- その変数がnullであった場合、
NullPointerExceptionが投げられる
- その変数がnullであった場合、
- 変数がnullのときに値を返したいときは
?:を使う- 例えば
v ?: 42は:vがnullでない場合、vの値が返るvがnullである場合、42が返る
- 例えば
標準ライブラリ
配列を作る
ラムダ式を使う方法
一見するとクラスの特殊な記法のように見えるが、実際はただの関数呼び出し
val squares = List(5) { (it + 1) * (it + 1) } // => [1, 4, 9, 16, 25]Listクラスのインスタンスを生成するList関数を呼び出している- 要素数
size: Intと各要素を作る関数init: (index: Int) -> Tを引数とする - クラス生成っぽくするためか、名前がCamelCaseになっている
- 慣例では、関数名はcamelCaseとするはず
- 参考:https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list.html
- 要素数
- 最後の引数として渡されるラムダ式は丸括弧の後ろに記述できる
- 引数が1つの場合にパラメータ宣言を省略すると、
itが暗黙的に宣言される - 参考:https://kotlinlang.org/docs/lambdas.html#passing-trailing-lambdas
- 引数が1つの場合にパラメータ宣言を省略すると、