Map.compute()
Вычисляет новое значение по ключу из старого (или из null, если ключа нет).
Доступно с: Java 8
Синтаксис
default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| key | K | Ключ. |
| remappingFunction | BiFunction<? 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.