⛹️‍♂️

【Kotlin】mapNotNullとfirstの処理を同時に行う

2022/02/21に公開

概要

KotlinにはmapNotNullという、mapの結果でnull以外のものを抽出する関数が用意されています。また、コレクションの最初・最後の要素を取得する (first, last)の記事で紹介されている、コレクションから先頭要素を取得するfirst関数もあります。
mapNotNullの結果の先頭要素を取得するには、first関数を呼び出せば良いのですが、この2つの処理を同時に処理する関数があったので紹介します。

対応方法

Kotlin1.5.0以降の機能ではありますが、firstNotNullOffirstNotNullOfOrNullという関数が追加されました。この機能を使えば上記の内容が実現できます。ドキュメントについてはこちらを参照ください。

実装サンプル

firstNotNullOffirstNotNullOfOrNullの違いを含めて、実装サンプルを紹介します。

まずはfirstNotNullOfです。文字列から数値に変換可能なものだけ抽出して、最初のものを出力するのをサンプルとして実装します。以下のような実装で出力は「1」になります。

val strArray = arrayOf("A", "1", "B", "2")
val firstNotNullOfSample = strArray.firstNotNullOf {
    it.toIntOrNull()
}
println(firstNotNullOfSample)

firstNotNullOfでは結果nullを許容しません。従って以下のような実装を行なった場合は、
No element of the array was transformed to a non-null valueのexceptionが発生します。

val strArray = arrayOf("A", "B")
val firstNotNullOfSample = strArray.firstNotNullOf {
    it.toIntOrNull()
}
println(firstNotNullOfSample)

nullを許可したい場合は、firstNotNullOfOrNullを使用します。以下の実装ではexceptionが発生せず、結果はnullとなります。

val strArray = arrayOf("A", "B")
val firstNotNullOfOrNullSample = strArray.firstNotNullOfOrNull {
    it.toIntOrNull()
}
println(firstNotNullOfOrNullSample)

Discussion