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
removeIfpe o listă creată cuList.ofsauArrays.asList. ApareUnsupportedOperationException; copiază mai întâi înnew ArrayList<>(...). - Inversezi condiția:
removeIfșterge elementele pentru care condiția estetrue, 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.