Map.putIfAbsent în Java

Pune valoarea doar dacă cheia lipsește (sau are null). Nu suprascrie o valoare existentă; returnează valoarea care era deja.

Sintaxă
default V putIfAbsent(K key, V value)

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 apoi get(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 putIfAbsent să returneze true/false. Returnează valoarea existentă (sau null).

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.