2020年11月12日木曜日

複数の nullable な mutable 変数の null チェック

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) // 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 件のコメント:

コメントを投稿