Когда в
Map нужно хранить несколько значений для одного ключа, часто появляется ручная проверка:var values = tags.get(topic);
if (values == null) {
values = new ArrayList<>();
tags.put(topic, values);
}
values.add(tag);
Здесь приходится отдельно получать значение, создавать список и записывать его обратно в
Map.computeIfAbsent() объединяет эти действия:tags.computeIfAbsent(topic, key -> new ArrayList<>())
.add(tag);
Функция создания вызывается только тогда, когда ключ отсутствует или связан с
null. Если список уже существует, Java сразу вернёт его:tags.computeIfAbsent("java", key -> new ArrayList<>())
.add("collections");
tags.computeIfAbsent("java", key -> new ArrayList<>())
.add("streams");В результате оба значения окажутся в одном списке:
{java=[collections, streams]}Тот же приём подходит для группировки объектов, ленивого создания настроек и простых локальных кэшей:
var config = configs.computeIfAbsent(
serviceName,
this::loadConfig
);
Важно: если функция вернёт
null, новое соответствие в Map добавлено не будет.👉 Java Ready | #совет
