Iterable.filterNotNull în Kotlin

Întoarce o listă nouă fără elementele null; tipul rezultatului nu mai permite null.

Sintaxă
fun <T : Any> Iterable<T?>.filterNotNull(): List<T>

Ce face Iterable.filterNotNull

Dintr-o listă de tip List<T?>, filterNotNull() păstrează doar valorile existente și întoarce List<T>. După asta poți folosi elementele fără ?. sau !!.

Valorile null apar des în date reale: câmpuri necompletate, căutări fără rezultat (map[cheie]), conversii eșuate. Dacă valorile vin dintr-un map { ... }, poți scrie direct mapNotNull { ... }.

Ce returnează

O List<T> cu elementele nenule, în aceeași ordine.

Exemple

Exemplul 1: Răspunsuri la un chestionar

Doi participanți nu au răspuns (null). Media se calculează doar din răspunsurile date.

fun main() {
    val raspunsuri: List<Int?> = listOf(5, null, 4, 3, null, 5)
    val date = raspunsuri.filterNotNull()

    println("Răspunsuri valide: $date")
    println("Lipsă: ${raspunsuri.size - date.size}")
    println("Media: ${date.average()}")
}

Rezultat

Răspunsuri valide: [5, 4, 3, 5]
Lipsă: 2
Media: 4.25

Exemplul 2: Valori găsite într-un map

Unele produse nu sunt în catalog, deci catalog[it] dă null.

fun main() {
    val catalog = mapOf("pâine" to 4.5, "lapte" to 7.0, "ouă" to 12.0)
    val cos = listOf("pâine", "cafea", "ouă", "ciocolată")

    val preturi = cos.map { catalog[it] }
    println(preturi)
    println("Total cunoscut: ${preturi.filterNotNull().sum()} lei")
}

Rezultat

[4.5, null, 12.0, null]
Total cunoscut: 16.5 lei

Greșeli frecvente

  • Scrii filter { it != null }: elimină valorile, dar tipul rămâne List<T?>. filterNotNull() schimbă și tipul.

Comenzi înrudite

  • Iterable.mapNotNull: Aplică o funcție fiecărui element și păstrează doar rezultatele care nu sunt null; firstNotNullOf întoarce primul astfel de rezultat.
  • listOfNotNull: Creează o listă doar cu valorile care nu sunt null; elementele null sunt sărite.
  • Iterable.filter: Creează o listă nouă doar cu elementele care îndeplinesc condiția (filterNot: cu cele care nu o îndeplinesc).
  • Iterable.filterIsInstance: Păstrează doar elementele de un anumit tip și întoarce o listă cu acel tip.