Ce face List.removeWhere
removeWhere modifică lista pe loc și șterge fiecare element pentru care test returnează true. retainWhere face opusul: păstrează doar elementele care trec testul.
Spre deosebire de where, care creează un iterable nou, acestea două schimbă lista existentă. Sunt modul corect de a șterge mai multe elemente: ștergerea cu remove într-o buclă for-in pe aceeași listă dă eroare.
Parametri
| Parametru | Descriere |
|---|---|
test |
Condiția verificată pe fiecare element. |
Ce returnează
Nimic (void).
Exemple
Exemplul 1: Curățarea unei liste
void main() {
final note = [9, 3, 7, 4, 10, 2];
note.removeWhere((n) => n < 5);
print('fără corigențe: $note');
final mesaje = ['Salut', '', 'Ce faci?', ' ', 'Pa'];
mesaje.retainWhere((m) => m.trim().isNotEmpty);
print(mesaje);
}
Rezultat
fără corigențe: [9, 7, 10]
[Salut, Ce faci?, Pa]
Exemplul 2: De ce nu ștergi în for-in
void main() {
final produse = ['lapte', 'expirat: iaurt', 'pâine', 'expirat: brânză'];
try {
for (final p in produse) {
if (p.startsWith('expirat')) produse.remove(p);
}
} on ConcurrentModificationError {
print('Eroare: lista s-a modificat în timpul parcurgerii');
}
produse.removeWhere((p) => p.startsWith('expirat'));
print(produse);
}
Rezultat
Eroare: lista s-a modificat în timpul parcurgerii
[lapte, pâine]
Greșeli frecvente
- Inversezi cele două:
retainWherepăstrează ce trece testul,removeWhereșterge ce trece testul.
Comenzi înrudite
List.remove: Șterge un element după valoare (remove), după poziție (removeAt) sau ultimul element (removeLast).Iterable.where: Păstrează doar elementele care trec un test; whereType păstrează doar elementele de un anumit tip.Map.remove: remove scoate o cheie din map și returnează valoarea ei (sau null); clear golește tot map-ul.Set.removeAll: removeAll șterge din set toate elementele date; retainAll păstrează doar elementele care apar în colecția dată.