Collections Intermediário

Atualizações atômicas em mapas com compute e merge

Substitua a consulta e a mutação de mapas em várias etapas por 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);
Viu um problema com este código? Nos avise.
⚡

Menos consultas

Evita acessos repetidos à chave.

🧵

Melhor semântica de concorrência

Mapas concorrentes podem realizar atualizações suportadas atomicamente.

👁

Intenção clara

A regra de inicialização aparece junto ao acesso.

Abordagem Antiga
get() + verificação de null + put()
Abordagem Moderna
computeIfAbsent()
Desde o JDK
8
Dificuldade
Intermediário
Atualizações atômicas em mapas com compute e merge
Disponível

Amplamente disponível desde o JDK 8 (março de 2014)

Métodos de computação de Map combinam a intenção de consulta e atualização em uma única operação. Use computeIfAbsent() para inicialização preguiçosa, compute() quando o novo valor depender do valor existente e merge() para combinar um valor fornecido com outro já presente no mapa. Em implementações de mapas concorrentes, as computações suportadas também evitam condições de corrida causadas por chamadas separadas a get() e put().