Iterable.single în Kotlin

Întoarce singurul element (sau singurul care îndeplinește condiția); aruncă excepție dacă sunt zero sau mai multe.

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

Ce face Iterable.single

single() întoarce elementul unei colecții care are exact un element. Cu o condiție, single { ... } cere ca exact un element să o îndeplinească. Este o verificare și o căutare în același timp: dacă datele nu sunt cum crezi, afli imediat.

Dacă nu există niciun element potrivit sau există mai multe, single aruncă o excepție (NoSuchElementException, respectiv IllegalArgumentException). singleOrNull întoarce null în ambele cazuri.

Parametri

Parametru Descriere
conditie Opțional: condiția pe care trebuie să o îndeplinească un singur element.

Ce returnează

Elementul unic (T); la singleOrNull, T?.

Exemple

Exemplul 1: Cod unic de produs

Codul „P-102” apare o singură dată, deci single întoarce produsul. Pentru „lapte” sunt două produse, iar singleOrNull dă null.

data class Produs(val cod: String, val nume: String)

fun main() {
    val produse = listOf(Produs("P-101", "lapte 1L"), Produs("P-102", "pâine"), Produs("P-103", "lapte 2L"))
    println(produse.single { it.cod == "P-102" })
    println(produse.singleOrNull { it.nume.startsWith("lapte") })
    println(listOf("unic").single())
}

Rezultat

Produs(cod=P-102, nume=pâine)
null
unic

Exemplul 2: Mesajele de eroare

Cazurile „mai multe” și „niciunul” dau excepții diferite.

fun main() {
    val note = listOf(9, 10, 9)
    try {
        note.single { it == 9 }
    } catch (e: IllegalArgumentException) {
        println("Mai multe: ${e.message}")
    }
    try {
        note.single { it == 5 }
    } catch (e: NoSuchElementException) {
        println("Niciunul: ${e.message}")
    }
}

Rezultat

Mai multe: Collection contains more than one matching element.
Niciunul: Collection contains no element matching the predicate.

Greșeli frecvente

  • Folosești single când pot exista mai multe rezultate. Dacă vrei doar primul, folosește first sau find.

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.find: Întoarce primul element care îndeplinește condiția sau null dacă nu există niciunul.
  • Iterable.count: Numără elementele colecției sau doar pe cele care îndeplinesc o condiție.