Collection.isEmpty în Kotlin

isEmpty/isNotEmpty verifică dacă o colecție are elemente; orEmpty transformă null în colecție goală; ifEmpty dă o alternativă.

Sintaxă
fun isEmpty(): Boolean
fun <T> Collection<T>.isNotEmpty(): Boolean
fun <T> Collection<T>?.orEmpty(): Collection<T>   // și List, Set, Map
inline fun <C, R> C.ifEmpty(implicit: () -> R): R where C : Collection<*>, C : R   // Kotlin 1.3

Ce face Collection.isEmpty

isEmpty() este true când colecția nu are elemente (size == 0), isNotEmpty() când are cel puțin unul. Se citesc mai ușor decât comparațiile cu size.

orEmpty() se apelează pe o colecție care poate fi null (List<T>?) și întoarce colecția, sau una goală dacă era null. Așa poți parcurge direct rezultatul fără verificări.

ifEmpty { ... } întoarce colecția dacă are elemente; dacă este goală, întoarce rezultatul blocului (de exemplu o listă implicită sau un mesaj).

Parametri

Parametru Descriere
implicit Pentru ifEmpty: blocul care dă rezultatul când colecția este goală.

Ce returnează

isEmpty/isNotEmpty: Boolean. orEmpty: colecția sau una goală. ifEmpty: colecția sau rezultatul blocului.

Exemple

Exemplul 1: Coș de cumpărături

Afișăm mesaje diferite după cum coșul are sau nu produse.

fun main() {
    val cos = mutableListOf<String>()
    println(if (cos.isEmpty()) "Coșul este gol" else "Ai ${cos.size} produse")
    cos.add("cafea")
    if (cos.isNotEmpty()) println("Poți plăti: $cos")
}

Rezultat

Coșul este gol
Poți plăti: [cafea]

Exemplul 2: orEmpty pe o listă care poate lipsi

Pentru „Vlad” map-ul întoarce null; orEmpty() o transformă în listă goală, deci size și for merg direct.

fun main() {
    val prieteni: Map<String, List<String>> = mapOf("Ana" to listOf("Ion", "Maria"))
    for (nume in listOf("Ana", "Vlad")) {
        val lista = prieteni[nume].orEmpty()
        println("$nume are ${lista.size} prieteni: $lista")
    }
}

Rezultat

Ana are 2 prieteni: [Ion, Maria]
Vlad are 0 prieteni: []

Exemplul 3: ifEmpty: o valoare de rezervă

Dacă filtrul nu găsește nimic, propunem lista implicită.

fun main() {
    val restaurante = listOf("Pizzeria Roma", "Bistro Copou", "Casa Veche")
    for (cautare in listOf("Bistro", "Sushi")) {
        val rezultat = restaurante.filter { cautare in it }.ifEmpty { listOf("(nimic găsit, încearcă alt cuvânt)") }
        println("$cautare: $rezultat")
    }
}

Rezultat

Bistro: [Bistro Copou]
Sushi: [(nimic găsit, încearcă alt cuvânt)]

Greșeli frecvente

  • Scrii lista?.isEmpty() == true pentru o listă care poate fi null. Mai simplu: lista.isNullOrEmpty() sau lista.orEmpty().isEmpty().
  • Scrii if (lista.size > 0): merge, dar isNotEmpty() spune mai clar intenția.

Comenzi înrudite

  • emptyList: Întoarce o listă, un map sau o mulțime goală, doar pentru citire; util ca valoare implicită sau rezultat „nimic găsit”.
  • Iterable.any: any: măcar un element îndeplinește condiția; all: toate o îndeplinesc; none: niciunul nu o îndeplinește.
  • 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.
  • Iterable.count: Numără elementele colecției sau doar pe cele care îndeplinesc o condiție.