【Kotlin/Android】配列(list)から条件にマッチする要素を取得!findとfirstの違い
この記事からわかること
- Kotlin/Android Studioで配列(リスト)から条件にマッチする要素を取得する方法
- find/findLastとfirst/lastの違い
- firstOrNull/lastOrNullの使い方
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Narwhal Feature Drop
- Kotlin:2.1.10
- Material3
- AGP:8.9.2
- Gradle:8.11.1
- Mac M1:Sequoia 15.6.1
配列(list)から条件にマッチする要素を取得する方法
Kotlinで配列(コレクション)から条件にマッチする要素を取得するにはfindメソッドまたはfirstメソッドを使用します。両者の使い方と違いをまとめていきます。
findメソッド
inline fun <T> Array<out T>.find(
predicate: (T) -> Boolean
): T?
findメソッドはコレクションから引数に渡した条件に最初にマッチする要素を取得するためのメソッドです。マッチするものがない場合はnullが返ります。
引数に渡した条件に最後にマッチする要素を取得したい場合はfindLastを使用します。
val numbers = listOf(1, 2, 3, 4, 5, 6, 7)
val firstOdd = numbers.find { it % 2 != 0 }
val lastEven = numbers.findLast { it % 2 == 0 }
val result = numbers.find { it > 10 }
print(firstOdd) // 1
print(lastEven) // 6
print(result) // null
first/lastメソッド
fun <T> Array<out T>.first(): T
inline fun <T> Array<out T>.first(
predicate: (T) -> Boolean
): T
firstメソッドは引数違いでただ単にコレクションの最初の要素を取得するものとfind同様にコレクションから引数に渡した条件に最初にマッチする要素を取得する2つがあります。マッチするものがない場合はエラー:NoSuchElementExceptionが返ります。
引数に渡した条件に最後にマッチする要素を取得したい場合はlastを使用します。
val numbers = listOf(1, 2, 3, 4, 5, 6, 7)
val first = numbers.first()
val firstOdd = numbers.first { it % 2 != 0 }
val last = numbers.last()
val lastEven = numbers.last { it % 2 == 0 }
val result = numbers.first { it > 10 }
// java.util.NoSuchElementException: Collection contains no element matching the predicate.
print(first) // 1
print(firstOdd) // 1
print(last) // 7
print(lastEven) // 6
firstOrNull/lastOrNull
エラーを発生させたくない場合はfirstOrNull/lastOrNullを使用することで存在しなかった場合にnullを返させることができます。
val numbers: List<Int> = emptyList()
val first = numbers.firstOrNull()
val last = numbers.lastOrNull()
print(first) // null
print(last) // null
両者の違いまとめ
- find:マッチするものがなかった場合はnullを返す
- first:マッチするものがなかった場合はエラーを返す
firstNotNullOf / firstNotNullOfOrNull
さらに似たようなメソッドにfirstNotNullOfとfirstNotNullOfOrNullがあります。この2つは要素に対してtransformを適応しその結果の中から最初にnullでないものを取得します。
inline fun <T, R : Any> Iterable<T>.firstNotNullOf(
transform: (T) -> R?
): R
firstNotNullOfとfirstNotNullOfOrNullの違いはnull以外があれば例外を投げるかnullを返却するかの違いです。
val list = listOf("a", "100", "b")
// 各要素を Int に変換できるか試す
// もしなければ例外を発生させる
val result = list.firstNotNullOf { it.toIntOrNull() }
println(result) // 100
firstNotNullOfOrNullであれば対象の要素がない場合にnullが返えります。
val list = listOf("a", "b", "c")
// Int に変換できる要素はないが例外が発生せずにnullが返る
val result = list.firstNotNullOfOrNull { it.toIntOrNull() }
println(result) // null
またこれらと相対するlast系のメソッドはないようです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。







