Encodera

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

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

Справочник Java

Map.compute()

Вычисляет новое значение по ключу из старого (или из null, если ключа нет).

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

Синтаксис

default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

Параметры

ПараметрТипОписание
keyKКлюч.
remappingFunctionBiFunction<? super K, ? super V, ? extends V>Получает ключ и текущее значение (null, если ключа нет) и возвращает новое; null удаляет ключ.

Возвращаемое значение

VНовое значение или null, если ключ удалён.

Примеры

Счётчик слов: для нового ключа v равно null:

void main() {
    Map<String, Integer> counts = new TreeMap<>();
    for (String w : List.of("a", "b", "a", "c", "a")) {
        counts.compute(w, (k, v) -> v == null ? 1 : v + 1);
    }
    IO.println(counts);
}

Результат:

{a=3, b=1, c=1}

Если функция вернёт null, ключ удаляется:

void main() {
    Map<String, Integer> stock = new HashMap<>(Map.of("apple", 1, "pear", 5));
    stock.compute("apple", (k, v) -> v - 1 == 0 ? null : v - 1);
    IO.println(stock);
}

Результат:

{pear=5}

Примечания

compute() — самый общий из трёх методов: computeIfAbsent() вызывает функцию только для отсутствующего ключа, computeIfPresent() — только для существующего. Для подсчёта короче merge(w, 1, Integer::sum). Внутри функции нельзя менять этот же словарь.

См. также

  • Map.computeIfPresent() — Меняет значение по ключу, только если ключ уже есть в словаре.
  • Map.computeIfAbsent() — Возвращает значение по ключу, создавая его функцией, если ключа нет.
  • Map.merge() — Добавляет значение по ключу или объединяет его с уже существующим.
  • Map.put() — Записывает значение по ключу, заменяя прежнее.

В учебнике

  • Словари: Map и HashMap — Словари Map в Java: пары ключ — значение, put и get, getOrDefault, подсчёт с merge, TreeMap и LinkedHashMap.

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

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