Collections Intermedio

Aggiornamenti atomici delle mappe con compute e merge

Sostituisci la ricerca e la mutazione della mappa in più passaggi con computeIfAbsent(), compute() e merge().

✕ Manual lookup and update
List<String> values = groups.get(key);
if (values == null) {
    values = new ArrayList<>();
    groups.put(key, values);
}
values.add(value);
✓ Java 8+
groups.computeIfAbsent(key, ignored -> new ArrayList<>())
        .add(value);
Vedi un problema con questo codice? Faccelo sapere.
⚡

Meno ricerche

Evita accessi ripetuti alla chiave.

🧵

Migliore semantica di concorrenza

Le mappe concorrenti possono eseguire atomicamente gli aggiornamenti supportati.

👁

Intento chiaro

La regola di inizializzazione appare accanto all'accesso.

Approccio Vecchio
get() + controllo null + put()
Approccio Moderno
computeIfAbsent()
Dal JDK
8
Difficoltà
Intermedio
Aggiornamenti atomici delle mappe con compute e merge
Disponibile

Ampiamente disponibile dal JDK 8 (marzo 2014)

I metodi di calcolo di Map combinano l'intento di ricerca e aggiornamento in una sola operazione. Usa computeIfAbsent() per l'inizializzazione lazy, compute() quando il nuovo valore dipende da quello esistente e merge() per combinare un valore fornito con uno già presente nella mappa. Nelle implementazioni di mappe concorrenti, i calcoli supportati evitano anche le race condition causate da chiamate separate a get() e put().