Ce face for-in
for (final x in colectie) ia pe rând fiecare element din orice Iterable: List, Set, map.keys, map.entries, un Iterable generat cu sync*. Scrie final dacă nu modifici variabila în buclă (recomandat), sau var.
Din Dart 3, variabila poate fi un pattern care desface elementul: for (final MapEntry(:key, :value) in map.entries) sau for (final (nume, nota) in perechi).
Nu modifica colecția în timpul parcurgerii: add sau remove pe aceeași listă aruncă ConcurrentModificationError. Pentru indice folosește for clasic sau lista.indexed.
Exemple
Exemplul 1: Elementele unei liste
Calculăm totalul unei comenzi.
void main() {
final preturi = [15.5, 4.0, 22.75];
var total = 0.0;
for (final pret in preturi) {
total += pret;
}
print('Total: $total lei');
}
Rezultat
Total: 42.25 lei
Exemplul 2: Un Map cu destructurare
Pattern-ul MapEntry(:key, :value) scoate cheia și valoarea direct în variabile.
void main() {
final populatie = {'Iași': 271692, 'Cluj-Napoca': 286598, 'Timișoara': 250849};
for (final MapEntry(:key, :value) in populatie.entries) {
print('$key are $value de locuitori');
}
}
Rezultat
Iași are 271692 de locuitori
Cluj-Napoca are 286598 de locuitori
Timișoara are 250849 de locuitori
Exemplul 3: Poziție și element cu indexed
indexed dă perechi (record-uri) (poziție, element), desfăcute în buclă.
void main() {
final clasament = ['Ana', 'Bogdan', 'Carmen'];
for (final (loc, nume) in clasament.indexed) {
print('Locul ${loc + 1}: $nume');
}
}
Rezultat
Locul 1: Ana
Locul 2: Bogdan
Locul 3: Carmen
Greșeli frecvente
lista.remove(x)în interiorul luifor-inpe aceeași listă:ConcurrentModificationError. FoloseșteremoveWhere.for (final x in map): unMapnu esteIterable. Parcurgemap.keys,map.valuessaumap.entries.- Pentru un
Streamse foloseșteawait for, nufor-in.
Comenzi înrudite
for: Bucla clasică cu contor: inițializare, condiție și pas, repetată cât timp condiția este adevărată.await for: Parcurge un Stream element cu element, așteptând fiecare eveniment; se termină când stream-ul se închide.pattern-uri (destructurare): Desfac o valoare (record, listă, map, obiect) în variabile separate, într-o singură declarație.sync* și yield: O funcție sync* este un generator: produce elementele unui Iterable unul câte unul, cu yield, doar când sunt cerute.