List.getOrNull în Kotlin

Citește elementul de la o poziție fără risc: getOrNull dă null, getOrElse o valoare implicită când poziția nu există.

Sintaxă
fun <T> List<T>.getOrNull(index: Int): T?
fun <T> List<T>.getOrElse(index: Int, implicit: (Int) -> T): T
fun <T> Iterable<T>.elementAt(index: Int): T

Ce face List.getOrNull

lista[i] aruncă IndexOutOfBoundsException dacă poziția nu există. getOrNull(i) întoarce în acest caz null, iar getOrElse(i) { ... } întoarce rezultatul funcției date (care primește poziția cerută).

elementAt(i) funcționează pe orice Iterable, inclusiv pe mulțimi, care nu au operatorul []. Pe o mulțime ordonată (setOf, sortedSetOf) poziția are sens; pe un HashSet ordinea nu este garantată. Există și elementAtOrNull și elementAtOrElse.

Parametri

Parametru Descriere
index Poziția cerută (de la 0).
implicit Pentru getOrElse: funcția care dă valoarea când poziția nu există.

Ce returnează

Elementul de la poziție, null (la getOrNull) sau valoarea implicită.

Exemple

Exemplul 1: Argumente opționale

Simulăm argumentele unui program. Poziția 2 nu există, așa că folosim o valoare implicită.

fun main() {
    val argumente = listOf("raport", "2026")
    val comanda = argumente.getOrNull(0) ?: "ajutor"
    val an = argumente.getOrNull(1)?.toIntOrNull() ?: 2025
    val format = argumente.getOrElse(2) { "pdf" }
    println("comandă=$comanda an=$an format=$format")
    println(argumente.getOrElse(5) { i -> "poziția $i lipsește" })
}

Rezultat

comandă=raport an=2026 format=pdf
poziția 5 lipsește

Exemplul 2: elementAt pe o mulțime

O mulțime creată cu setOf păstrează ordinea inserării, deci a doua poziție are sens.

fun main() {
    val podium = setOf("Ioana", "Vlad", "Sorina")
    println(podium.elementAt(1))
    println(podium.elementAtOrNull(7))
    try {
        podium.elementAt(7)
    } catch (e: IndexOutOfBoundsException) {
        println("Eroare: ${e.message}")
    }
}

Rezultat

Vlad
null
Eroare: Collection doesn't contain element at index 7.

Greșeli frecvente

  • Verifici manual if (i < lista.size) lista[i] else null, dar uiți de pozițiile negative. getOrNull tratează ambele cazuri.
  • Folosești elementAt pe un HashSet și te bazezi pe rezultat: ordinea nu este garantată.

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.
  • List.indices: indices este intervalul pozițiilor valide ale listei (0..size-1); lastIndex este poziția ultimului element.
  • List: Tipul listei doar pentru citire: elemente în ordine, accesate după poziție, fără funcții de adăugare sau ștergere.
  • Map.getValue: Citește valoarea unei chei: getValue aruncă excepție dacă lipsește, getOrDefault și getOrElse dau o valoare de rezervă.