List.removeAll în Java

removeAll șterge toate elementele care apar în altă colecție; retainAll le păstrează doar pe acestea.

Sintaxă
boolean removeAll(Collection<?> c)
boolean retainAll(Collection<?> c)

Ce face List.removeAll

removeAll(c) șterge din listă toate aparițiile oricărui element din c. retainAll(c) face invers: păstrează doar elementele care apar în c și le șterge pe celelalte. Ordinea elementelor rămase nu se schimbă.

Ambele returnează true dacă lista s-a modificat. Compararea se face cu equals, iar c poate fi orice colecție. Dacă c este mare, e mai rapid să fie un HashSet, pentru că pentru fiecare element al listei se apelează c.contains(...).

Parametri

Parametru Descriere
c Colecția cu valorile de șters (removeAll) sau de păstrat (retainAll).

Ce returnează

true dacă lista s-a schimbat.

Exemple

Exemplul 1: Scoaterea produselor indisponibile

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        List<String> cos = new ArrayList<>(List.of("lapte", "ouă", "pâine", "ouă", "unt"));
        Set<String> lipsa = Set.of("ouă", "unt");
        boolean schimbat = cos.removeAll(lipsa);
        System.out.println(schimbat + " " + cos);
    }
}

Rezultat

true [lapte, pâine]

Exemplul 2: Elevi prezenți la ambele ore (retainAll)

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> mate = new ArrayList<>(List.of("Ana", "Mihai", "Ioana", "Radu"));
        List<String> romana = List.of("Ioana", "Ana", "Elena");
        mate.retainAll(romana);
        System.out.println("La ambele: " + mate);
        System.out.println("A doua oară: " + mate.retainAll(romana));
    }
}

Rezultat

La ambele: [Ana, Ioana]
A doua oară: false

Greșeli frecvente

  • Crezi că removeAll șterge doar prima apariție. Le șterge pe toate.
  • Folosești retainAll pe o listă și pierzi datele originale. Dacă mai ai nevoie de ele, lucrează pe o copie: new ArrayList<>(lista).

Comenzi înrudite

  • List.remove: Șterge elementul de la o poziție sau prima apariție a unei valori; elementele de după se mută la stânga.
  • Collection.removeIf: Șterge din colecție toate elementele pentru care condiția dată este adevărată. Returnează true dacă s-a șters ceva.
  • List.contains: Verifică dacă lista conține o valoare (contains) sau toate valorile altei colecții (containsAll).