6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Kotlin] listOfNotNull() の使い方を考えてみる

Posted at

TwitterでKotlin公式がTipsをツイートしていたので、どんな風に使うのか確認してみた。

listOfNotNull()

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)

と、思ったら、候補を表示してくれた。

2020-07-17_22h35_59.png

なるほど、これなら覚えておく必要はない。使ってもいいかもしれない。

どこで使えるか

動的に情報を表示する画面を作るときに使えるかもしれないと思った。
例えば、次のようなメソッドがあったとする。

    fun getHeader(): Item?
    fun getBody(): Array<Item?>
    fun getFooter(): Item?

その時のデータに応じて、画面の構成要素を返すメソッドだと思ってほしい。
null以外なら画面に表示するが、nullなら取り除きたい。

これまでなら次のように1つずつ手動でnullチェックするコードを書いていたかもしれない。

nullを除外するコード例
    val items = buildList {
        getHeader()?.let { add(it) }
        getBody().filterNotNull().forEach { add(it) }
        getFooter()?.let { add(it) }
    }

それがlistOfNotNull()を使うと次のように書ける。

listOfNotNull()を使った例
    val items = listOfNotNull(
        getHeader(),
        *getBody(),
        getFooter()
    )

シンプルである。
(スプレッド演算子(*)を使って、*getBody()としたかったので、こっそりArray<Item?>と定義していた)

感想

使いどころは限られるかもしれないけれど、こういったデータを扱うときには確かにスッキリ書ける。
これが使えるところに遭遇したらぜひとも使っていこう。

ただ、どんなときに使えるかは、正直なところ上記の例以外には具体的に浮かばなかった。
他に使いどころがあれば教えてほしい…。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?