ScalaのOptionにはmap
とgetOrElse
メソッドがあって、次のような便利なイディオムが書けます。
scala
val x1: Option[Int] = Some(10)
val x2: Option[Int] = None
val y1 = x1.map(_ + 10).getOrElse(0)
// -> 20
val y2 = x2.map(_ + 10).getOrElse(0)
// -> 0
これと同じようなことをKotlinのNullableでifを書かないでやりたい。
kotlinでもこう書きたい
val x1: Int? = 10
val x2: Int? = null
val y1 = x1.map {it + 10}.getOrElse { 0 }
// -> 20
val y2 = x2.map {it + 10}.getOrElse { 0 }
// -> 0
次のようにNullableを拡張すればOKです。(forEachはおまけ)
ScalaOption.kt
package com.frontier45
/**
* Created by du on 16/01/29.
*/
fun <T1, T2> T1?.map(f: (T1) -> T2): T2? {
return if (this != null) {
f(this)
} else {
null
}
}
fun <T> T?.forEach(f: (T) -> Unit): Unit {
if (this != null) {
f(this)
}
}
fun <T> T?.getOrElse(f: () -> T): T {
return this ?: f()
}
getOrElse
の引数にデフォルト値ではなく、引数なしの関数を渡すことでnullだった時の値として複雑なブロックも使用できるようになっているのがポイント。
val y1 = x1.map {
cool codes
}.getOrElse {
awesome codes
}
Gistはこちら。
https://gist.github.com/lucidfrontier45/8d3dddc0d8a0d232e997
(編集 2016-01-29)
頂いたコメントよりmap
とforEach
は不要とわかりました。代わりに?.let
を使用すればいいようです。
getOrElse
も別名にした方がいいです。