Collections Intermedio

Actualizaciones atómicas de mapas con compute y merge

Sustituye la consulta y mutación de mapas en varios pasos por computeIfAbsent(), compute() y 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);
¿Ves un problema con este código? Cuéntanos.
⚡

Menos consultas

Evita accesos repetidos a la clave.

🧵

Mejor semántica de concurrencia

Los mapas concurrentes pueden realizar atómicamente las actualizaciones compatibles.

👁

Intención clara

La regla de inicialización aparece junto al acceso.

Enfoque Antiguo
get() + comprobación de null + put()
Enfoque Moderno
computeIfAbsent()
Desde JDK
8
Dificultad
Intermedio
Actualizaciones atómicas de mapas con compute y merge
Disponible

Ampliamente disponible desde JDK 8 (marzo de 2014)

Los métodos de cálculo de Map combinan la intención de consulta y actualización en una sola operación. Usa computeIfAbsent() para la inicialización diferida, compute() cuando el nuevo valor dependa del existente y merge() para combinar un valor proporcionado con otro que ya esté en el mapa. En implementaciones de mapas concurrentes, los cálculos compatibles también evitan las condiciones de carrera causadas por llamadas separadas a get() y put().