Collection.removeIf în Java

Șterge din colecție toate elementele pentru care condiția dată este adevărată. Returnează true dacă s-a șters ceva.

Sintaxă
default boolean removeIf(Predicate<? super E> filter)

Ce face Collection.removeIf

removeIf(conditie) primește o funcție care returnează true sau false pentru fiecare element (un Predicate, scris de obicei ca lambda: n -> n < 5). Elementele pentru care rezultatul este true sunt șterse direct din colecție.

Este varianta sigură și scurtă pentru „șterge în timp ce parcurgi”. Dacă ștergi cu lista.remove(x) în interiorul unui for-each, apare ConcurrentModificationException; removeIf evită problema.

Funcționează pe orice colecție modificabilă: ArrayList, HashSet, TreeSet, ArrayDeque, și pe vederile unui map (map.values().removeIf(...)).

Parametri

Parametru Descriere
filter Condiția: elementele pentru care returnează true sunt șterse.

Ce returnează

true dacă a fost șters cel puțin un element.

Exemple

Exemplul 1: Ștergerea notelor de trecere sub 5

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

public class Main {
    public static void main(String[] args) {
        List<Integer> note = new ArrayList<>(List.of(9, 4, 7, 3, 10, 5));
        boolean sters = note.removeIf(n -> n < 5);
        System.out.println(sters + " " + note);
        System.out.println(note.removeIf(n -> n < 5) + " (nu mai era nimic de șters)");
    }
}

Rezultat

true [9, 7, 10, 5]
false (nu mai era nimic de șters)

Exemplul 2: Curățarea unei mulțimi și a valorilor unui map

Ștergerea din values() scoate din map perechile întregi.

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

public class Main {
    public static void main(String[] args) {
        TreeSet<String> emailuri = new TreeSet<>(List.of("ana@exemplu.ro", "", "radu@exemplu.ro", "test"));
        emailuri.removeIf(e -> !e.contains("@"));
        System.out.println(emailuri);

        TreeMap<String, Integer> stoc = new TreeMap<>();
        stoc.put("mere", 12);
        stoc.put("pere", 0);
        stoc.put("prune", 0);
        stoc.values().removeIf(cant -> cant == 0);
        System.out.println(stoc);
    }
}

Rezultat

[ana@exemplu.ro, radu@exemplu.ro]
{mere=12}

Greșeli frecvente

  • Apelezi removeIf pe o listă creată cu List.of sau Arrays.asList. Apare UnsupportedOperationException; copiază mai întâi în new ArrayList<>(...).
  • Inversezi condiția: removeIf șterge elementele pentru care condiția este true, nu le păstrează.

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.
  • List.removeAll: removeAll șterge toate elementele care apar în altă colecție; retainAll le păstrează doar pe acestea.
  • Iterator.remove: Șterge din colecție elementul returnat ultima dată de next(). Este felul sigur de a șterge în timpul parcurgerii.
  • Collection.stream: Creează un Stream peste elementele colecției, ca să le filtrezi, transformi, sortezi sau aduni într-un rezultat.