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
putIfAbsentca să schimbi o valoare existentă. Nu o schimbă; pentru asta foloseșteupdatesaumap[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.