イディオム
Kotlinでよく使用されるイディオムを集めました。もし好みのイディオムがあれば、プルリクエストを投げて貢献してください。
DTOの作成(POJO/ POCO)
- data class Customer(val name: String, val email: String)
Customerクラスは次の機能を提供します:
- ?全てのプロパティのゲッター(とvarキーワードが使用されたときはセッターも)
?equals()
?hashCode()
?toString()
?copy()
?すべてのプロパティに対して、component1(), component2(), …, (Data classesを参照してください) 関数の引数に対するデフォルト値
関数の引数に対するデフォルト値
- fun foo(a: Int = 0, b: String = "") { ... }
リストのフィルタリング
- val positives = list.filter { x -> x > 0 }
または、こう短くも書けます:
- val positives = list.filter { it > 0 }
文字列補完
- println("Name $name")
インスタンスのチェック
- when (x) {
is Foo -> ...
is Bar -> ...
else -> ...
}
mapやlistのペアを書き下す
- for ((k, v) in map) {
println("$k -> $v")
}
k, vは何からでも呼び出すことができます。
範囲の使用
- for (i in 1..100) { ... }
for (x in 2..10) { ... }
読み取り専用list
- val list = listOf("a", "b", "c")
読み取り専用map
- val map = mapOf("a" to 1, "b" to 2, "c" to 3)
mapへのアクセス
- println(map["key"])
map["key"] = value
遅延評価プロパティ
- val p: String by lazy {
// 文字列を評価
}
拡張関数
- fun String.spaceToCamelCase() { ... }
"Convert this to camelcase".spaceToCamelCase()
シングルトンの作成
- object Resource {
val name = "Name"
}
if not nullの省略記法
- val files = File("Test").listFiles()
println(files?.size)
if not null and elseの省略記法
- val files = File("Test").listFiles()
println(files?.size ?: "empty")
if null文の実行
- val data = ...
val email = data["email"] ?: throw IllegalStateException("Email is missing!")
if not null文の実行
- val data = ...
data?.let {
... // nullでなければこのブロックを実行する
}
when文でreturnする
- fun transform(color: String): Int {
return when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
}
'try / catch'式
- fun test() {
val result = try {
count()
} catch (e: ArithmeticException) {
throw IllegalStateException(e)
}
// resultを使って何かする
}
'if'式
- fun foo(param: Int) {
val result = if (param == 1) {
"one"
} else if (param == 2) {
"two"
} else {
"three"
}
}
Unitを返すメソッドのビルダースタイルの使用
- fun arrayOfMinusOnes(size: Int): IntArray {
return IntArray(size).apply { fill(-1) }
}
単一式関数
- fun theAnswer() = 42
これは次と等価です:
- fun theAnswer(): Int {
return 42
}
これは他のイディオムと組み合わせることができ、コードを短くすることにつながります。例) when-式:
- fun transform(color: String): Int = when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
'with' を使って、あるオブジェクトのインスタンスで複数の関数を呼ぶ
- class Turtle {
fun penDown()
fun penUp()
fun turn(degrees: Double)
fun forward(pixels: Double)
}
val myTurtle = Turtle()
with(myTurtle) { // 100pxの四角形を描く
penDown()
for(i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
Java 7のtry-with-resources
- val stream = Files.newInputStream(Paths.get("/some/file.txt"))
stream.buffered().reader().use { reader ->
println(reader.readText())
}