[Android/Kotlin]配列のフィルタリング

目次

通常のフィルタリング(filterメソッド)

以下のように条件に見合った要素だけを取り出す場合はfilterメソッドを使用する。

Kotlin
val gameTitles = listOf("ドラクエ", "ボンバーマン", "がんばれゴエモンきらきら道中", "スーパーマリオブラザーズ", "ゼルダの伝説", "ドラクエ2", "ボンバーマン2", "がんばれゴエモンゆき姫救出絵巻")
Log.d("ゴエモン", gameTitles.filter { it.startsWith("がんばれゴエモン") }.toString())
出力結果
D/ゴエモン: [がんばれゴエモンきらきら道中, がんばれゴエモンゆき姫救出絵巻]

括弧内では各要素を表す「it」を使用する。
上記の例では「がんばれゴエモン」で始まる文字列のみを取得するようにしている。
これが「偶数だけ」を取得するようにするなら括弧内を「it % 2 == 0」ようにする。

Kotlin
val integerList = listOf<Int>(1, 2, 3, 4, 5)
Log.d("偶数", integerList.filter { it%2 == 0 }.toString())

逆にfilterNotメソッドを使用すると、逆に条件式に合う要素を取り除くことができる。

Null以外の要素を取得する(filterNotNullメソッド)

以下の例では配列のうちNullのものだけ取り除くメソッド。
これならNullを処理一つで弾けるから便利!

Kotlin
val gameTitles = listOf("ドラクエ", null, "がんばれゴエモンきらきら道中", null, "ゼルダの伝説", "ドラクエ2", "ボンバーマン2", "がんばれゴエモンゆき姫救出絵巻")
Log.d("Not Null", gameTitles.filterNotNull().toString())
出力結果
D/Not Null: [ドラクエ, がんばれゴエモンきらきら道中, ゼルダの伝説, ドラクエ2, ボンバーマン2, がんばれゴエモンゆき姫救出絵巻]

参考ページ:
天才まくまくノート「コレクションから条件に一致する要素のみを取り出す (filter, filterNot, filterKeys, filterValues)」
天才まくまくノート「配列やリストから null 以外の要素のみを抽出する (filterNotNull, mapNotNull)」