Atomowe aktualizacje map za pomocą compute i merge
Zastąp wieloetapowe wyszukiwanie i modyfikowanie mapy metodami computeIfAbsent(), compute() i merge().
Porównanie kodu
✕ 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);
Widzisz problem z tym kodem? Daj nam znać.
Dlaczego nowoczesne podejście wygrywa
Mniej wyszukiwań
Eliminuje wielokrotny dostęp do tego samego klucza.
Lepsza semantyka współbieżności
Mapy współbieżne mogą atomowo wykonywać obsługiwane aktualizacje.
Jasny zamiar
Reguła inicjalizacji znajduje się bezpośrednio przy operacji dostępu.
Stare podejście
get() + sprawdzenie null + put()
Nowoczesne podejście
computeIfAbsent()
Od JDK
8
Poziom trudności
Średniozaawansowany
Wsparcie JDK
Atomowe aktualizacje map za pomocą compute i merge
Dostępne
Szeroko dostępne od JDK 8 (marzec 2014)
Jak to działa
Metody obliczeniowe Map łączą zamiar wyszukania i aktualizacji w jednej operacji. Używaj computeIfAbsent() do leniwej inicjalizacji, compute(), gdy nowa wartość zależy od istniejącej, a merge() do połączenia dostarczonej wartości z wartością obecną już w mapie. W implementacjach map współbieżnych obsługiwane obliczenia zapobiegają też wyścigom powodowanym przez osobne wywołania get() i put().
Powiązana dokumentacja
Dowód