Map.computeIfPresent()
Меняет значение по ключу, только если ключ уже есть в словаре.
Доступно с: Java 8
Синтаксис
default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| key | K | Ключ. |
| remappingFunction | BiFunction<? super K, ? super V, ? extends V> | Получает ключ и текущее значение и возвращает новое; null удаляет ключ. |
Возвращаемое значение
VНовое значение или null, если ключа не было или он удалён.
Примеры
Отсутствующий ключ не добавляется:
void main() {
Map<String, Integer> prices = new TreeMap<>(Map.of("tea", 3, "coffee", 4));
prices.computeIfPresent("tea", (k, v) -> v + 1);
prices.computeIfPresent("juice", (k, v) -> v + 1);
IO.println(prices);
}Результат:
{coffee=4, tea=4}Уменьшение количества в корзине с удалением позиции, когда остался ноль:
void main() {
Map<String, Integer> cart = new TreeMap<>(Map.of("pen", 1, "book", 2));
cart.computeIfPresent("pen", (k, v) -> v > 1 ? v - 1 : null);
cart.computeIfPresent("book", (k, v) -> v > 1 ? v - 1 : null);
IO.println(cart);
}Результат:
{book=1}Примечания
Заменяет связку if (map.containsKey(key)) map.put(key, ...) одним вызовом. Для отсутствующего ключа функция не вызывается и метод возвращает null. Если ключа может не быть и его нужно создать, используйте compute() или merge().
См. также
- Map.compute() — Вычисляет новое значение по ключу из старого (или из null, если ключа нет).
- Map.computeIfAbsent() — Возвращает значение по ключу, создавая его функцией, если ключа нет.
- Map.merge() — Добавляет значение по ключу или объединяет его с уже существующим.
- Map.containsKey() — Проверяет, есть ли в словаре ключ.
В учебнике
- Словари: Map и HashMap — Словари Map в Java: пары ключ — значение, put и get, getOrDefault, подсчёт с merge, TreeMap и LinkedHashMap.