Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

Map.computeIfAbsent()

Возвращает значение по ключу, создавая его функцией, если ключа нет.

Доступно с: Java 8

Синтаксис

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

Параметры

ПараметрТипОписание
keyKКлюч.
mappingFunctionFunction<? 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.