TwitterでKotlin公式がTipsをツイートしていたので、どんな風に使うのか確認してみた。
listOfNotNull()
If you want to store some nullable values in a non-nullable list (or set), you don’t have to null-check manually. Instead, use the listOfNotNull() function (and, starting with Kotlin 1.4, setOfNotNull()). #KotlinTips pic.twitter.com/LTcIumU4wb
— Kotlin (@kotlin) July 15, 2020
listOfNotNull()
という関数。
nullを含めたくないリストを作るときに、手動でnull
チェックする必要はないよ、とのこと。
試す
こういうことらしい。
val a: Int = 1
val b: Int? = 2
val c: Int? = null
val list = listOfNotNull(a, b, c)
println(list) // [1, 2]
確かにnull
は除外されている。
覚えていられるか
「listOfNotNull()
という関数を覚えておくこと」がそこまでのメリットになる感じがしない。
わざわざ専用の関数を覚えなくても、listOf()
とfilterNotNulll()
を組み合わせたらいいんじゃないか?
val list = listOf(a, b, c).filterNotNull()
println(list)
と、思ったら、候補を表示してくれた。
なるほど、これなら覚えておく必要はない。使ってもいいかもしれない。
どこで使えるか
動的に情報を表示する画面を作るときに使えるかもしれないと思った。
例えば、次のようなメソッドがあったとする。
fun getHeader(): Item?
fun getBody(): Array<Item?>
fun getFooter(): Item?
その時のデータに応じて、画面の構成要素を返すメソッドだと思ってほしい。
null
以外なら画面に表示するが、null
なら取り除きたい。
これまでなら次のように1つずつ手動でnull
チェックするコードを書いていたかもしれない。
val items = buildList {
getHeader()?.let { add(it) }
getBody().filterNotNull().forEach { add(it) }
getFooter()?.let { add(it) }
}
それがlistOfNotNull()
を使うと次のように書ける。
val items = listOfNotNull(
getHeader(),
*getBody(),
getFooter()
)
シンプルである。
(スプレッド演算子(*
)を使って、*getBody()
としたかったので、こっそりArray<Item?>
と定義していた)
感想
使いどころは限られるかもしれないけれど、こういったデータを扱うときには確かにスッキリ書ける。
これが使えるところに遭遇したらぜひとも使っていこう。
ただ、どんなときに使えるかは、正直なところ上記の例以外には具体的に浮かばなかった。
他に使いどころがあれば教えてほしい…。