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
singlecând pot exista mai multe rezultate. Dacă vrei doar primul, foloseștefirstsaufind.
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.