Iterable.find în Kotlin

Întoarce primul element care îndeplinește condiția sau null dacă nu există niciunul.

Sintaxă
fun <T> Iterable<T>.find(conditie: (T) -> Boolean): T?

Ce face Iterable.find

find { ... } parcurge colecția în ordine și se oprește la primul element pentru care condiția este true. Dacă nu găsește nimic, întoarce null. Este exact același lucru cu firstOrNull { ... }, doar cu un nume mai potrivit pentru căutări.

Pentru ultimul element care se potrivește există findLast { ... } (echivalent cu lastOrNull { ... }). Pentru poziția elementului, folosește indexOfFirst { ... }.

Parametri

Parametru Descriere
conditie Funcția care întoarce true pentru elementul căutat.

Ce returnează

Primul element potrivit sau null.

Exemple

Exemplul 1: Căutarea unui utilizator după email

Rezultatul are tipul Utilizator?, așa că tratăm cazul în care nu există.

data class Utilizator(val nume: String, val email: String)

fun main() {
    val utilizatori = listOf(
        Utilizator("Ana Pop", "ana@exemplu.ro"),
        Utilizator("Ion Rusu", "ion@exemplu.ro"),
    )
    for (email in listOf("ion@exemplu.ro", "dan@exemplu.ro")) {
        val gasit = utilizatori.find { it.email == email }
        println(if (gasit != null) "$email -> ${gasit.nume}" else "$email -> cont inexistent")
    }
}

Rezultat

ion@exemplu.ro -> Ion Rusu
dan@exemplu.ro -> cont inexistent

Exemplul 2: find, findLast și indexOfFirst

Prima și ultima zi cu ploaie, plus poziția primei zile.

fun main() {
    val zile = listOf("luni", "marți", "miercuri", "joi", "vineri")
    val ploaie = listOf(false, true, false, true, false)

    val indexPrima = ploaie.indexOfFirst { it }
    val primaZi = zile.find { ploaie[zile.indexOf(it)] }
    val ultimaZi = zile.findLast { ploaie[zile.indexOf(it)] }
    println("Prima zi cu ploaie: $primaZi (poziția $indexPrima)")
    println("Ultima zi cu ploaie: $ultimaZi")
    println(zile.find { it.startsWith("s") })
}

Rezultat

Prima zi cu ploaie: marți (poziția 1)
Ultima zi cu ploaie: joi
null

Greșeli frecvente

  • Folosești filter { ... }.firstOrNull(): verifică toată lista și creează una nouă. find se oprește la primul element găsit.
  • Pui !! după find „pentru că sigur există”. Dacă datele se schimbă, programul se oprește cu NullPointerException; preferă ?: cu un mesaj clar.

Comenzi înrudite

  • Iterable.first: first/last întorc primul sau ultimul element (sau primul care îndeplinește o condiție); variantele OrNull dau null în loc de excepție.
  • Iterable.any: any: măcar un element îndeplinește condiția; all: toate o îndeplinesc; none: niciunul nu o îndeplinește.
  • Iterable.contains: contains (operatorul in) verifică dacă un element există; indexOf dă poziția primei apariții sau -1.
  • Iterable.single: Întoarce singurul element (sau singurul care îndeplinește condiția); aruncă excepție dacă sunt zero sau mai multe.