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().
Comparação de Código
✕ 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.
Por que a forma moderna ganha
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
Suporte JDK
Atualizações atômicas em mapas com compute e merge
Disponível
Amplamente disponível desde o JDK 8 (março de 2014)
Como funciona
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().
Documentação Relacionada
Prova