Ce face Iterable.first
first() întoarce primul element al colecției, last() ultimul. Cu o condiție, first { ... } întoarce primul element care o îndeplinește, iar last { ... } ultimul.
Dacă lista este goală sau niciun element nu se potrivește, first și last aruncă NoSuchElementException. firstOrNull și lastOrNull întorc în acest caz null, ceea ce se combină bine cu ?:: lista.firstOrNull() ?: "nimic".
Folosește variantele fără OrNull doar când ești sigur că elementul există; altfel alege OrNull.
Parametri
| Parametru | Descriere |
|---|---|
conditie |
Opțional: funcția care spune ce element cauți. |
Ce returnează
Elementul găsit (T) sau, la variantele OrNull, T?.
Exemple
Exemplul 1: Primul, ultimul, primul care se potrivește
Lista este în ordinea sosirii. Căutăm și primul client care a cheltuit peste 100 de lei.
data class Bon(val client: String, val suma: Int)
fun main() {
val bonuri = listOf(Bon("Ana", 45), Bon("Ion", 130), Bon("Maria", 80), Bon("Vlad", 210))
println("Primul: ${bonuri.first().client}")
println("Ultimul: ${bonuri.last().client}")
println("Primul peste 100: ${bonuri.first { it.suma > 100 }.client}")
println("Ultimul sub 100: ${bonuri.last { it.suma < 100 }.client}")
}
Rezultat
Primul: Ana
Ultimul: Vlad
Primul peste 100: Ion
Ultimul sub 100: Maria
Exemplul 2: Variantele OrNull pe o listă goală
firstOrNull dă null, iar ?: pune un text implicit. first() pe aceeași listă aruncă o excepție.
fun main() {
val mesajeNecitite = emptyList<String>()
println(mesajeNecitite.firstOrNull() ?: "Nu ai mesaje noi")
println(listOf(3, 8, 12).lastOrNull { it > 20 })
try {
println(mesajeNecitite.first())
} catch (e: NoSuchElementException) {
println("Eroare: ${e.message}")
}
}
Rezultat
Nu ai mesaje noi
null
Eroare: List is empty.
Greșeli frecvente
- Apelezi
first()pe o listă care poate fi goală (rezultatul unuifilter, date de la utilizator): programul se oprește cuNoSuchElementException. FoloseștefirstOrNull(). - Scrii
lista[lista.size - 1]pentru ultimul element:last()saulastOrNull()este mai clar.
Comenzi înrudite
Iterable.find: Întoarce primul element care îndeplinește condiția sau null dacă nu există niciunul.Iterable.single: Întoarce singurul element (sau singurul care îndeplinește condiția); aruncă excepție dacă sunt zero sau mai multe.List.getOrNull: Citește elementul de la o poziție fără risc: getOrNull dă null, getOrElse o valoare implicită când poziția nu există.Iterable.take: take(n) întoarce primele n elemente, iar drop(n) întoarce tot ce rămâne după ce sari peste primele n.