Map.computeIfAbsent()
Возвращает значение по ключу, создавая его функцией, если ключа нет.
Доступно с: Java 8
Синтаксис
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| key | K | Ключ. |
| mappingFunction | Function<? super K, ? extends V> | Создаёт значение по ключу; вызывается, только если ключа нет. |
Возвращаемое значение
VТекущее (существующее или только что созданное) значение.
Примеры
Группировка слов по первой букве:
void main() {
Map<Character, List<String>> byLetter = new TreeMap<>();
for (String w : List.of("apple", "bean", "avocado", "beet", "corn")) {
byLetter.computeIfAbsent(w.charAt(0), k -> new ArrayList<>()).add(w);
}
IO.println(byLetter);
}Результат:
{a=[apple, avocado], b=[bean, beet], c=[corn]}Простой кэш: функция вызывается один раз для ключа:
void main() {
Map<Integer, Long> cache = new HashMap<>();
Function<Integer, Long> slowSquare = n -> {
IO.println("computing " + n);
return (long) n * n;
};
IO.println(cache.computeIfAbsent(12, slowSquare));
IO.println(cache.computeIfAbsent(12, slowSquare));
}Результат:
computing 12
144
144Примечания
Главное применение — словарь списков: map.computeIfAbsent(key, k -> new ArrayList<>()).add(value). Если функция вернёт null, пара не добавляется. Внутри функции нельзя менять этот же словарь. Родственные методы: computeIfPresent() и compute().
См. также
- Map.putIfAbsent() — Записывает значение, только если ключа ещё нет.
- Map.merge() — Добавляет значение по ключу или объединяет его с уже существующим.
- Collectors.groupingBy() — Сборщик, который раскладывает элементы по группам с общим ключом.
Вопросы и ответы по теме
В учебнике
- Словари: Map и HashMap — Словари Map в Java: пары ключ — значение, put и get, getOrDefault, подсчёт с merge, TreeMap и LinkedHashMap.