Collection.retainAll în Java

retainAll păstrează doar elementele care apar și în altă colecție; containsAll verifică dacă le conține pe toate.

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

Ce face Collection.retainAll

a.retainAll(b) șterge din a tot ce nu apare în b. Ce rămâne este partea comună (intersecția). Returnează true dacă a s-a modificat.

a.containsAll(b) nu modifică nimic: returnează true dacă fiecare element din b se găsește în a. Ordinea și numărul de apariții nu contează. Pentru o colecție b goală, rezultatul este mereu true.

Ambele compară elementele cu equals. Pentru colecții mari, e mai rapid ca colecția în care se caută (b la retainAll, a la containsAll) să fie un HashSet.

Parametri

Parametru Descriere
c Colecția cu care se compară.

Ce returnează

retainAll: true dacă s-a schimbat colecția. containsAll: true dacă le conține pe toate.

Exemple

Exemplul 1: Ingredientele comune a două rețete

import java.util.List;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        TreeSet<String> clatite = new TreeSet<>(List.of("făină", "ouă", "lapte", "zahăr"));
        List<String> cozonac = List.of("făină", "drojdie", "lapte", "zahăr", "nuci");

        TreeSet<String> comune = new TreeSet<>(clatite);
        boolean schimbat = comune.retainAll(cozonac);
        System.out.println(schimbat + " " + comune);
        System.out.println("Clătitele au rămas: " + clatite);
    }
}

Rezultat

true [făină, lapte, zahăr]
Clătitele au rămas: [făină, lapte, ouă, zahăr]

Exemplul 2: Am tot ce trebuie pentru rețetă? (containsAll)

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

public class Main {
    public static void main(String[] args) {
        Set<String> camara = Set.of("făină", "ouă", "lapte", "sare");
        List<String> omleta = List.of("ouă", "lapte", "sare");
        List<String> tort = List.of("ouă", "făină", "ciocolată");

        System.out.println("Omletă: " + camara.containsAll(omleta));
        System.out.println("Tort: " + camara.containsAll(tort));
        System.out.println("Nimic: " + camara.containsAll(List.of()));
    }
}

Rezultat

Omletă: true
Tort: false
Nimic: true

Greșeli frecvente

  • Folosești retainAll pe colecția originală când mai ai nevoie de ea. Lucrează pe o copie.
  • Crezi că containsAll numără aparițiile: List.of("a").containsAll(List.of("a", "a")) este true.

Comenzi înrudite

  • List.removeAll: removeAll șterge toate elementele care apar în altă colecție; retainAll le păstrează doar pe acestea.
  • List.contains: Verifică dacă lista conține o valoare (contains) sau toate valorile altei colecții (containsAll).
  • Set.remove: remove scoate un element; removeAll face diferența a două mulțimi, retainAll intersecția. Toate spun dacă s-a schimbat ceva.
  • Set.contains: contains verifică rapid dacă un element este în mulțime; containsAll verifică dacă sunt toate elementele altei colecții.
  • Collection.addAll: Adaugă în colecție toate elementele altei colecții. Returnează true dacă s-a schimbat ceva.