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âneList<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.