Collections Fortgeschritten

Atomare Map-Aktualisierungen mit compute und merge

Mehrstufiges Nachschlagen und Ändern von Maps durch computeIfAbsent(), compute() und merge() ersetzen.

✕ 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);
Problem mit diesem Code entdeckt? Sag uns Bescheid.
⚡

Weniger Suchvorgänge

Vermeidet wiederholte Schlüsselzugriffe.

🧵

Bessere Nebenläufigkeitssemantik

Nebenläufige Maps können unterstützte Aktualisierungen atomar ausführen.

👁

Klare Absicht

Die Initialisierungsregel steht direkt neben dem Zugriff.

Alter Ansatz
get() + null-Prüfung + put()
Moderner Ansatz
computeIfAbsent()
Seit JDK
8
Schwierigkeitsgrad
Fortgeschritten
Atomare Map-Aktualisierungen mit compute und merge
Verfügbar

Weitgehend verfügbar seit JDK 8 (März 2014)

Die Berechnungsmethoden von Map vereinen die Absicht von Nachschlagen und Aktualisieren in einer Operation. computeIfAbsent() eignet sich für verzögerte Initialisierung, compute(), wenn der neue Wert vom vorhandenen Wert abhängt, und merge(), um einen übergebenen Wert mit einem bereits in der Map vorhandenen Wert zu kombinieren. Bei nebenläufigen Map-Implementierungen vermeiden unterstützte Berechnungen außerdem Race Conditions, die durch getrennte get()- und put()-Aufrufe entstehen.