Iterable.first în Kotlin

first/last întorc primul sau ultimul element (sau primul care îndeplinește o condiție); variantele OrNull dau null în loc de excepție.

Sintaxă
fun <T> Iterable<T>.first(): T
fun <T> Iterable<T>.first(conditie: (T) -> Boolean): T
fun <T> Iterable<T>.firstOrNull(): T?
fun <T> List<T>.last(): T
fun <T> List<T>.lastOrNull(): T?

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 unui filter, date de la utilizator): programul se oprește cu NoSuchElementException. Folosește firstOrNull().
  • Scrii lista[lista.size - 1] pentru ultimul element: last() sau lastOrNull() 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.