Java: Функции
Теория: Методы Compute в Map
forEach() не единственный метод в Map, работающий с лямбда-функциями. Кроме него есть набор методов compute. Они позволяют вычислять значение динамически, базируясь на том, существует ли запрашиваемый ключ в коллекции или нет.
compute()
Метод compute() обновляет значение ключа в Map, на основе логики, заданной внутри лямбда-функции. Эта лямбда-функция получает на вход текущее значение ключа, выполняет с ним необходимые операции и возвращает новое значение.
В примере выше, метод compute() вызывается для каждого слова из списка. Лямбда-функция принимает на вход ключ и значение, которое является количеством повторений слова в списке. Дальше в зависимости от того, первый ли раз встречается это слово или нет, изменяется количество повторений. Без compute() нам бы пришлось написать код похожий на этот:
Здесь мы встречаемся с интересной особенностью сокращенной версии лямбда-функции. В примерах выше не прописан явно возврат, но он выполняется, иначе значение было бы невозможно использовать. Возврат в сокращенной версии лямбда-функции выполняется автоматически. Полная версия выглядела бы так:
computeIfAbsent()
Метод computeIfAbsent() отличается от compute(), тем, что лямбда вызывается только в том случае, если ключа в коллекции до этого не было. С его помощью, например, реализуется кеш, специальное хранилище, которое хранит данные, полученные в результате выполнения тяжелой операции. Это позволяет экономить ресурсы на повторных запросах, которые проходят уже без вычисления.
computeIfPresent()
Метод computeIfPresent() отличается от compute() тем, что лямбда вызывается только в том случае, если ключ уже был добавлен в коллекцию. Ниже пример кода, который применяет скидку к товарам, находящимся внутри коллекции, без ручной проверки того, есть ли они там на самом деле:

