for-in în Dart

Parcurge pe rând elementele unei liste, unui set sau oricărui Iterable, fără indice.

Sintaxă
for (final element in colectie) {
  ...
}
for (final (a, b) in perechi) { ... }   // cu pattern (Dart 3)

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 lui for-in pe aceeași listă: ConcurrentModificationError. Folosește removeWhere.
  • for (final x in map): un Map nu este Iterable. Parcurge map.keys, map.values sau map.entries.
  • Pentru un Stream se folosește await for, nu for-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.