2020年11月12日木曜日

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

nullable な mutable 変数 a と b があって、両方 non-null のとき何かしたいという場合、

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

0 件のコメント:

コメントを投稿