これだとコンパイルエラーになる
var a: String? = "Hello"
var b: String? = "Android"
fun main() {
if (a != null && b != null) {
println(a.length + b.length) // compile error!
}
}
let だと入れ子になるからいまいち
var a: String? = "Hello"
var b: String? = "Android"
fun main() {
a?.let { a ->
b?.let { b ->
println(a.length + b.length)
}
}
}
ローカルの変数に入れれば OK
var a: String? = "Hello"
var b: String? = "Android"
fun main() {
val a = a
val b = b
if (a != null && b != null) {
println(a.length + b.length) // ok
}
}
vararg を使って、渡した値が全部 non-null だったら block を実行するというメソッドを用意すると、let っぽい感じで入れ子にせずに書ける
var a: String? = "Hello"
var b: String? = "Android"
fun main() {
doIfAllNotNull(a, b) { (a, b) ->
println(a.length + b.length)
}
}
private inline fun <T> doIfAllNotNull(
vararg value: T?,
block: (values: List<T>) -> Unit
) {
val nonNullValues = value.filterNotNull()
if (nonNullValues.size == value.size) {
block(nonNullValues)
}
}
0 件のコメント:
コメントを投稿