nullable な mutable 変数 a と b があって、両方 non-null のとき何かしたいという場合、
これだとコンパイルエラーになる
- var a: String? = "Hello"
- var b: String? = "Android"
-
- fun main() {
- if (a != null && b != null) {
- println(a.length + b.length)
- }
- }
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)
- }
- }
- }
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)
- }
- }
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)
- }
- }
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 件のコメント:
コメントを投稿