Map.putIfAbsent în Dart

Returnează valoarea unei chei; dacă cheia lipsește, o calculează cu funcția dată, o salvează și o returnează.

Sintaxă
V putIfAbsent(K key, V ifAbsent())

Ce face Map.putIfAbsent

putIfAbsent(cheie, () => valoare) verifică dacă cheia există. Dacă există, returnează valoarea ei și nu cheamă funcția. Dacă nu există, cheamă funcția, pune rezultatul în map și îl returnează.

Este ideal pentru cache-uri și pentru gruparea elementelor: „dă-mi lista pentru această cheie, creând-o dacă nu există”.

Parametri

Parametru Descriere
key Cheia căutată.
ifAbsent Funcția fără parametri care produce valoarea, chemată doar dacă cheia lipsește.

Ce returnează

Valoarea existentă sau valoarea nou adăugată.

Exemple

Exemplul 1: Gruparea elevilor pe clase

void main() {
  final elevi = [('Ana', '9A'), ('Mihai', '9B'), ('Ioana', '9A'), ('Radu', '9B'), ('Elena', '10A')];
  final peClase = <String, List<String>>{};
  for (final (nume, clasa) in elevi) {
    peClase.putIfAbsent(clasa, () => []).add(nume);
  }
  print(peClase);
}

Rezultat

{9A: [Ana, Ioana], 9B: [Mihai, Radu], 10A: [Elena]}

Exemplul 2: Un cache simplu

Funcția costisitoare rulează o singură dată pentru fiecare oraș; a doua cerere vine din cache.

final cache = <String, int>{};

int lungimeCalculata(String oras) {
  print('  calculez pentru $oras');
  return oras.length;
}

void main() {
  for (final oras in ['Iași', 'Cluj', 'Iași', 'Cluj', 'Iași']) {
    final n = cache.putIfAbsent(oras, () => lungimeCalculata(oras));
    print('$oras -> $n');
  }
}

Rezultat

  calculez pentru Iași
Iași -> 4
  calculez pentru Cluj
Cluj -> 4
Iași -> 4
Cluj -> 4
Iași -> 4

Greșeli frecvente

  • Modifici map-ul din interiorul funcției ifAbsent. Nu este permis și poate da erori; funcția trebuie doar să calculeze valoarea.
  • Folosești putIfAbsent ca să schimbi o valoare existentă. Nu o schimbă; pentru asta folosește update sau map[cheie] = ....

Comenzi înrudite

  • Map.update: update schimbă valoarea unei chei pe baza valorii vechi; updateAll schimbă toate valorile din map.
  • Map.containsKey: containsKey verifică dacă o cheie există în map, iar containsValue dacă o valoare apare la vreo cheie.
  • Map.operator[]: map[cheie] citește valoarea unei chei (sau null), iar map[cheie] = valoare adaugă sau înlocuiește o pereche.