LoginSignup
5
1

More than 3 years have passed since last update.

【Kotlin】find, firstOrNull, singleOrNullの違いは?調べてみました!

Last updated at Posted at 2020-05-27

Android開発でKotlinを書いている中で「find firstOrNull singleOrNullって同じじゃね?」と思ったので調べました。

TL;DR

  • findfirstOrNullは同じ挙動なので好きな方を使えばOK
  • singleOrNullは該当する要素が1つのみであることを確認したい場合に使うのが良さそう

動かしてみる

サンプル:https://pl.kotl.in/0WB5a4Efr

find

fun find() {
    val numbers = listOf(0, 1, 2, 3, 4, 4)
    val four = numbers.find { it == 4 }
    println(four)
    val five = numbers.find { it == 5 }
    println(five)
}

結果

4
null

firstOrNull

fun firstOrNull() {
    val numbers = listOf(0, 1, 2, 3, 4, 4)
    val four = numbers.firstOrNull { it == 4 }
    println(four)
    val five = numbers.firstOrNull { it == 5 }
    println(five)
}

結果

4
null

singleOrNull

fun singleOrNull() {
    val numbers = listOf(0, 1, 2, 3, 4, 4)
    val four = numbers.singleOrNull { it == 4 }
    println(four)
    val five = numbers.singleOrNull { it == 5 }
    println(five)
}

結果

null
null

実装

find

@kotlin.internal.InlineOnly
public inline fun <T> Iterable<T>.find(predicate: (T) -> Boolean): T? {
    return firstOrNull(predicate)
}

findfirstOrNullのエイリアスだった

firstOrNull

public inline fun <T> Iterable<T>.firstOrNull(predicate: (T) -> Boolean): T? {
    for (element in this) if (predicate(element)) return element
    return null
}

要素を見つけたら返すだけ

singleOrNull

public inline fun <T> Iterable<T>.singleOrNull(predicate: (T) -> Boolean): T? {
    var single: T? = null
    var found = false
    for (element in this) {
        if (predicate(element)) {
            if (found) return null
            single = element
            found = true
        }
    }
    if (!found) return null
    return single
}

該当する要素が2つ以上ある場合nullを返す

いかがでしたか?

findfirstOrNullのエイリアスだったんですね〜
この3つのメソッドのうち、singleOrNullは若干挙動が違うもののそこまで違いを意識して使わなくて良さそうでした。
このテーマについてはStack OverflowKotlinコミュニティでも議論されているようなので興味のある方は見てみるといいかもしれません。

5
1
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
5
1