Map.fromIterable în Dart

fromIterable face cheile și valorile din aceleași elemente; fromIterables lipește o listă de chei de o listă de valori.

Sintaxă
factory Map<K, V>.fromIterable(Iterable iterable, {K key(dynamic element)?, V value(dynamic element)?})
factory Map<K, V>.fromIterables(Iterable<K> keys, Iterable<V> values)

Ce face Map.fromIterable

Map.fromIterable(lista, key: ..., value: ...) calculează pentru fiecare element o cheie și o valoare. Fără funcții, elementul este și cheie, și valoare. Parametrii funcțiilor sunt de tip dynamic, deci în codul nou se preferă un literal cu for: {for (final x in lista) cheie: valoare}.

Map.fromIterables(chei, valori) pune prima cheie cu prima valoare, a doua cu a doua și așa mai departe. Cele două iterable trebuie să aibă aceeași lungime; altfel apare ArgumentError.

Parametri

Parametru Descriere
iterable Elementele din care se calculează perechile.
key / value Funcțiile care dau cheia și valoarea pentru un element.
keys / values Pentru fromIterables: cheile și valorile, în aceeași ordine.

Ce returnează

Un Map nou (un LinkedHashMap).

Exemple

Exemplul 1: Lungimea fiecărui nume

void main() {
  final nume = ['Ana', 'Mihai', 'Ioana'];
  final lungimi = Map<String, int>.fromIterable(nume, value: (n) => (n as String).length);
  print(lungimi);

  final laFel = {for (final n in nume) n: n.length};
  print(laFel);
}

Rezultat

{Ana: 3, Mihai: 5, Ioana: 5}
{Ana: 3, Mihai: 5, Ioana: 5}

Exemplul 2: Două liste lipite într-un map

void main() {
  final zile = ['luni', 'marți', 'miercuri'];
  final temperaturi = [18, 21, 19];
  final meteo = Map.fromIterables(zile, temperaturi);
  print(meteo);

  try {
    Map.fromIterables(zile, [1, 2]);
  } on ArgumentError catch (e) {
    print('Eroare: ${e.message}');
  }
}

Rezultat

{luni: 18, marți: 21, miercuri: 19}
Eroare: Iterables do not have same length.

Greșeli frecvente

  • Dai liste de lungimi diferite lui fromIterables. Apare ArgumentError, nu se taie automat la cea mai scurtă.
  • Folosești fromIterable fără tipuri și primești un Map<dynamic, dynamic>. Scrie tipurile, Map<String, int>.fromIterable(...), sau folosește un literal cu for.

Comenzi înrudite

  • Map.fromEntries: Construiește un map dintr-o succesiune de perechi MapEntry, de exemplu entries filtrate sau sortate.
  • Map.of: Map.of face o copie modificabilă a unui map; Map.unmodifiable face o copie care nu mai poate fi schimbată.
  • collection if și for: if și for direct în interiorul unei liste, set sau map, pentru a construi colecția dintr-o singură expresie.