TGViewer
Java библиотека Java библиотека @javalib · 30.6K subscribers
Post #7783 1.37K
Знали, что Map.getOrDefault может вызвать загрузку, даже когда ключ уже есть?

Java сначала вычисляет аргументы метода, и только потом вызывает сам метод.

Поэтому дорогой вызов справа выполнится заранее:
User user = users.getOrDefault(id, loadUser(id));


Даже если users уже содержит id, loadUser(id) успеет выполниться. Если это запрос к базе, сеть или вычисление, приложение потратит время зря.

Для ленивого вычисления значения подойдёт computeIfAbsent:
User user = users.computeIfAbsent(id, this::loadUser);


Функция загрузки вызывается только тогда, когда ключ отсутствует или связан с null. Возвращённое ненулевое значение добавляется в map и дальше берётся из неё.

Проверь и семантику отсутствующего результата. Если загрузчик вернёт null, запись не появится, и следующий вызов снова попробует загрузить пользователя:
User user = users.computeIfAbsent(id, key -> findUser(key).orElse(null));


Ещё один нюанс касается конкурентного доступа. Для параллельных потоков выбирай подходящую concurrent map и не помещай в функцию долгую блокирующую работу без понимания гарантий конкретной реализации.

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
  • 👍 3
  • ⚡ 2
  • 🔥 1
More from @javalib
  1. Oct 16, 2026Топ-3 товаров через Map.merge Есть названия покупок с повторами. Сначала считаем частоты,…
  2. Oct 16, 2026Почему equals у массивов в Java не сравнивает содержимое? В Java массив выглядит как конте…
  3. Oct 16, 2026Какая структура данных в коллекции List? В Java интерфейс List представляет упорядоченную…
  4. Oct 16, 2026Post #7784
  5. Oct 15, 2026👩‍💻 Подводные камни Retry Policy в Java В статье на реальных примерах показывают retry-ш…
  6. Oct 15, 2026Память в Java растёт? Сначала выясните, что удерживает объекты Рост потребления памяти не…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →