collection if și for în Dart

if și for direct în interiorul unei liste, set sau map, pentru a construi colecția dintr-o singură expresie.

Sintaxă
[
  element,
  if (conditie) elementDaca,
  if (conditie) a else b,
  for (final x in sursa) transformare(x),
  if (valoare case int n) n,        // Dart 3
]

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ă if sau for în colecție (if (x) { 'a' }): acoladele creează un Set în listă. Scrie elementul direct.
  • ; după elementul din if: în colecții se separă cu virgulă.
  • Instrucțiuni (print, atribuiri) în for-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.