イディオム

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())
}