Ce face collection if și for
Într-un literal de colecție poți scrie if ca să incluzi un element doar când o condiție este adevărată, și for ca să adaugi câte un element pentru fiecare valoare dintr-o sursă. Nu sunt instrucțiuni, ci părți din expresia colecției, deci nu au acolade sau ;.
Se pot combina cu spread și între ele: for (...) if (...) x sau if (...) ...lista. În map-uri, elementul este o pereche cheie: valoare. Din Dart 3 poți folosi și if-case cu pattern-uri.
Sunt foarte folosite în Flutter, pentru a construi liste de widget-uri, dar sunt utile oriunde construiești o colecție, înlocuind combinații de add, map și where.
Exemple
Exemplul 1: Elemente condiționate
Meniul arată opțiunea „Administrare” doar administratorilor.
List<String> meniu({required bool admin, required bool autentificat}) => [
'Acasă',
'Produse',
if (autentificat) 'Contul meu' else 'Autentificare',
if (admin) 'Administrare',
];
void main() {
print(meniu(admin: false, autentificat: false));
print(meniu(admin: true, autentificat: true));
}
Rezultat
[Acasă, Produse, Autentificare]
[Acasă, Produse, Contul meu, Administrare]
Exemplul 2: for în listă și în map
Lista de etichete și map-ul de prețuri cu TVA se construiesc direct, cu for în literal.
void main() {
final preturi = {'Cafea': 20.0, 'Ceai': 12.0, 'Ciocolată': 8.5};
final etichete = [
for (final e in preturi.entries) '${e.key}: ${e.value} lei',
];
print(etichete);
final cuTva = {
for (final e in preturi.entries) e.key: (e.value * 1.21).toStringAsFixed(2),
};
print(cuTva);
}
Rezultat
[Cafea: 20.0 lei, Ceai: 12.0 lei, Ciocolată: 8.5 lei]
{Cafea: 24.20, Ceai: 14.52, Ciocolată: 10.29}
Exemplul 3: for și if împreună
Doar elevii promovați intră în listă, cu numele scris cu majuscule.
void main() {
final medii = {'Ana': 9.5, 'Bogdan': 4.2, 'Cristi': 7.8, 'Dana': 4.9};
final promovati = [
for (final MapEntry(key: nume, value: medie) in medii.entries)
if (medie >= 5) nume.toUpperCase(),
];
print('Promovați: $promovati');
}
Rezultat
Promovați: [ANA, CRISTI]
Greșeli frecvente
- Acolade după
ifsauforîn colecție (if (x) { 'a' }): acoladele creează unSetîn listă. Scrie elementul direct. ;după elementul dinif: în colecții se separă cu virgulă.- Instrucțiuni (
print, atribuiri) înfor-ul din colecție: acolo poate sta doar un element.
Comenzi înrudite
spread (...): Operatorul … pune toate elementele unei colecții în interiorul altei liste, set sau map.for-in: Parcurge pe rând elementele unei liste, unui set sau oricărui Iterable, fără indice.if și else: Execută un bloc de cod doar dacă o condiție este adevărată; else tratează cazul contrar.pattern-uri (destructurare): Desfac o valoare (record, listă, map, obiect) în variabile separate, într-o singură declarație.