MutableCollection.removeAll în Kotlin

Liste și colecții modificabile Kotlin 1.0 (removeIf: Java 8)

Șterge pe loc toate elementele care îndeplinesc o condiție (removeAll, removeIf) sau păstrează doar pe cele care o îndeplinesc (retainAll).

Sintaxă
fun <T> MutableIterable<T>.removeAll(conditie: (T) -> Boolean): Boolean
fun removeAll(elemente: Collection<E>): Boolean
fun <T> MutableIterable<T>.retainAll(conditie: (T) -> Boolean): Boolean
fun retainAll(elemente: Collection<E>): Boolean
fun removeIf(conditie: (E) -> Boolean): Boolean   // din Java

Ce face MutableCollection.removeAll

removeAll { ... } șterge din colecție toate elementele pentru care condiția este adevărată. removeAll(altaColectie) șterge toate elementele care apar în cealaltă colecție. removeIf { ... } vine din Java și face același lucru ca removeAll cu condiție.

retainAll face opusul: păstrează doar elementele care îndeplinesc condiția (sau care sunt în cealaltă colecție) și le șterge pe restul.

Toate schimbă colecția pe loc și întorc true dacă s-a șters măcar un element. Sunt varianta corectă pentru a șterge în timp ce verifici, fără ConcurrentModificationException. Dacă vrei o listă nouă și să păstrezi originalul, folosește filter / filterNot.

Parametri

Parametru Descriere
conditie Funcția care alege elementele de șters (removeAll, removeIf) sau de păstrat (retainAll).
elemente O colecție: se șterg (sau se păstrează) elementele care apar în ea.

Ce returnează

true dacă colecția s-a schimbat.

Exemple

Exemplul 1: Ștergerea notelor sub 5

removeAll cu condiție șterge toate notele mici. Al doilea apel nu mai găsește nimic și întoarce false.

fun main() {
    val note = mutableListOf(9, 4, 7, 3, 10, 4)
    println(note.removeAll { it < 5 })
    println(note)
    println(note.removeAll { it < 5 })
}

Rezultat

true
[9, 7, 10]
false

Exemplul 2: retainAll: doar ce e și în stoc

Din coș rămân doar produsele care există în stoc.

fun main() {
    val cos = mutableListOf("pâine", "cafea", "lapte", "ciocolată")
    val stoc = setOf("pâine", "lapte", "mere")
    cos.retainAll(stoc)
    println(cos)
}

Rezultat

[pâine, lapte]

Exemplul 3: removeIf și removeAll cu o colecție

removeIf scoate orașele cu nume scurt; removeAll(listOf(...)) scoate toate aparițiile orașelor date.

fun main() {
    val orase = mutableListOf("Iași", "Cluj", "Arad", "Sibiu", "Constanța", "Arad")
    orase.removeIf { it.length <= 4 }
    println(orase)

    val vizitate = mutableListOf("Sibiu", "Brașov", "Sibiu", "Oradea")
    vizitate.removeAll(listOf("Sibiu"))
    println(vizitate)
}

Rezultat

[Sibiu, Constanța]
[Brașov, Oradea]

Greșeli frecvente

  • Ștergi elemente cu remove într-o buclă for pe aceeași listă: ConcurrentModificationException. Folosește removeAll { ... }.
  • Confunzi removeAll cu retainAll: primul șterge ce se potrivește, al doilea păstrează ce se potrivește.

Comenzi înrudite

  • Iterable.filter: Creează o listă nouă doar cu elementele care îndeplinesc condiția (filterNot: cu cele care nu o îndeplinesc).
  • MutableList.remove: remove șterge prima apariție a unei valori; removeAt șterge elementul de pe o poziție și îl întoarce.
  • MutableList.clear: clear golește lista (size devine 0); fill înlocuiește toate elementele cu aceeași valoare, păstrând numărul lor.
  • MutableList.add: Adaugă un element la finalul listei sau la o poziție dată; addAll adaugă mai multe elemente deodată.