Ce face Map.putIfAbsent
putIfAbsent(cheie, valoare) verifică întâi cheia. Dacă nu există (sau are valoarea null), pune valoarea și returnează null. Dacă există, nu schimbă nimic și returnează valoarea existentă.
Este potrivită pentru „primul câștigă”: prima înregistrare a unui nume de utilizator, prima oră de sosire. Valoarea se creează însă mereu, chiar dacă nu e folosită; când crearea e costisitoare (de exemplu o listă nouă), computeIfAbsent e mai potrivită.
Parametri
| Parametru | Descriere |
|---|---|
key |
Cheia. |
value |
Valoarea pusă dacă cheia lipsește. |
Ce returnează
Valoarea existentă sau null dacă a fost pusă cea nouă.
Exemple
Exemplul 1: Prima oră de sosire la birou
import java.util.LinkedHashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
String[][] pontaj = {{"Ana", "08:55"}, {"Radu", "09:10"}, {"Ana", "13:00"}, {"Radu", "14:20"}};
Map<String, String> sosire = new LinkedHashMap<>();
for (String[] p : pontaj) {
String deja = sosire.putIfAbsent(p[0], p[1]);
if (deja != null) {
System.out.println(p[0] + " ignorat la " + p[1] + ", sosit deja la " + deja);
}
}
System.out.println(sosire);
}
}
Rezultat
Ana ignorat la 13:00, sosit deja la 08:55
Radu ignorat la 14:20, sosit deja la 09:10
{Ana=08:55, Radu=09:10}
Exemplul 2: Completarea setărilor lipsă
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Map<String, String> setari = new TreeMap<>(Map.of("limbă", "en"));
setari.putIfAbsent("limbă", "ro"); // există deja, rămâne en
setari.putIfAbsent("monedă", "lei"); // lipsea, se adaugă
System.out.println(setari);
}
}
Rezultat
{limbă=en, monedă=lei}
Greșeli frecvente
- Folosești
putIfAbsent(k, new ArrayList<>())și apoiget(k).add(...). Merge, dar creezi o listă la fiecare apel și cauți de două ori;computeIfAbsent(k, x -> new ArrayList<>()).add(...)e mai bun. - Te aștepți ca
putIfAbsentsă returnezetrue/false. Returnează valoarea existentă (saunull).
Comenzi înrudite
Map.put: put adaugă o pereche cheie → valoare sau înlocuiește valoarea unei chei existente; putAll copiază toate perechile altui map.Map.computeIfAbsent: Dacă cheia lipsește, calculează valoarea cu funcția dată și o pune în map. Returnează valoarea (nouă sau existentă). Ideal pentru grupări.Map.get: get returnează valoarea unei chei sau null dacă lipsește; getOrDefault returnează o valoare de rezervă în loc de null.Map.merge: Pune valoarea dacă cheia lipsește; dacă există, combină valoarea veche cu cea nouă (de exemplu le adună). Ideal pentru numărători și totaluri.