Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

Использование функции computeIfAbsent в Java: руководство

Быстрый ответ

Метод computeIfAbsent, входящий в интерфейс Map, служит для вычисления и добавления нового значения в Map-коллекцию в том случае, если такого значения ещё нет. Данный метод сработает лишь при необходимости, облегчая и эффективно заменяя использование get. Рассмотрим следующий пример:

Java
Скопировать код
Map<String, Integer> fruitCounts = new HashMap<>();
fruitCounts.computeIfAbsent("банан", key -> key.length()); // Добавит элемент "банан"=6, так как слово "банан" содержит 6 букв 🍌

Как видно из этого лаконичного примера, мы проверяем присутствие элемента "банан", и если его нет, добавляем в карту количество букв в этом слове. Это способствует улучшению чистоты и читабельности кода.

Кинга Идем в IT: пошаговый план для смены профессии

Применение computeIfAbsent

Функция computeIfAbsent особенно востребована в сценариях, которые требуют рекурсивных вычислений или работы с мультимапами:

Оптимизация через мемоизацию

Применение метода мемоизации в сочетании с computeIfAbsent помогает сократить количество повторяющихся вычислений в рекурсивных функциях. В качестве примера вычислим факториал числа с использованием кэша:

Java
Скопировать код
Map<Integer, Long> memo = new HashMap<>();

public long factorial(int n) {
    return memo.computeIfAbsent(n, k -> (k == 0) ? 1 : k * factorial(k – 1));
}

С использованием computeIfAbsent мы сохраняем вычисленные значения факториалов, благодаря чему узраним повторные вызовы рекурсивной функции.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Обработка несуществующих значений

Метод помогает предотвратить NullPointerException, автоматически инициализируя объекты при необходимости:

Java
Скопировать код
Map<String, List<String>> multiMap = new HashMap<>();
multiMap.computeIfAbsent("фрукты", k -> new ArrayList<>()).add("яблоко"); // Добавляем "яблоко" в список без озабоченности о его наличии

Таким образом, проблема отсутствующих значений остаётся в прошлом.

Продвинутое использование

computeIfAbsent позволяет создавать более аккуратный и эффективный код даже в сложных ситуациях:

Составление иерархичных карт

Один из примеров демонстрирует создание многоуровневых структур данных:

Java
Скопировать код
Map<String, TreeMap<Integer, TreeSet<String>>> complexMap = new HashMap<>();

complexMap.computeIfAbsent("Категория", k -> new TreeMap<>())
           .computeIfAbsent(10, k -> new TreeSet<>())
           .add("Объект"); // Такая структура создаётся быстрее, чем вы представляете 🚲

С помощью цепочки вызовов computeIfAbsent получается гибко создавать сложные структуры данных.

Упрощение с методами-ссылками

Используя ссылки на методы, computeIfAbsent может быть упрощен для более компактного кода:

Java
Скопировать код
Map<String, Boolean> stringIsEmpty = new HashMap<>();
stringIsEmpty.computeIfAbsent("статус", String::isEmpty); // Пустые статусы никому не нравятся

В данном случае String::isEmpty служит более короткой записью для лямбда-выражения, что улучшает прозрачность кода.

Глубина проникновения в мир Java

Изучая рекомендации авторитетных экспертов, таких как Стюарт Маркс и Брайан Гоэтц, можно углубить свои знания о computeIfAbsent и открыть для себя новые горизонты в Java.

Советы и техники

Будьте внимательны к следующим деталям при использовании computeIfAbsent:

Остерегайтесь реентерабельных лямбда-выражений

Лямбда-выражение в computeIfAbsent может обращаться к той же карте, которую редактирует, и, хотя это может быть полезно, необдуманное использование это может привести к проблемам.

Широта использования лямбд и методов-ссылок

Понимание и умение эффективно использовать лямбда-выражения и методы-ссылки упростят работу с кодом.

Избегание созданий лишних объектов

computeIfAbsent гарантирует создание объектов только тогда, когда это действительно необходимо, тем самым избавляя систему от ненужной нагрузки.

Визуализация

Представьте картотеку, в которой каждый ярлык — это ключ, а документ внутри — его значение.

Если вы запросите отчет по "Проекту X", вы получите его в случае его наличия. Если его нет, ассистент создаст его для вас. Именно так работает computeIfAbsent.

Полезные материалы

  1. Официальная документация Oracle о методе computeIfAbsent.
  2. Интерактивный учебный курс Oracle об интерфейсах Map.
  3. Руководство по использованию ссылок на методы в Java.
  4. Вводный урок об использовании лямбда-выражений в Java.
  5. Статья от GeeksforGeeks о computeIfAbsent с примерами.
  6. Учебное видео на YouTube о применении computeIfAbsent в Java.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой метод используется для проверки и добавления значения в Map, если его нет?
1 / 5