Получить доступ

Чем orElse отличается от orElseGet?

MiddleЛямбды и Stream API
Коротко

orElse(value) — аргумент вычисляется всегда, даже если значение есть (обычный порядок вычисления аргументов). orElseGet(supplier) — поставщик вызывается только при отсутствии.

  • Константа — разницы нет
  • Поход в базу или создание тяжёлого объекта — только orElseGet
  • Побочный эффект в orElse выполнится всегда — коварная ошибка

А ещё orElseThrow(supplier) — тоже ленивый

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Это обычный порядок вычисления аргументов в Java: выражение считается до вызова метода. Пока альтернатива — константа, разницы нет, но если там поход в базу или создание тяжёлого объекта, вы платите за него на каждом вызове, включая случаи, когда значение присутствовало. Хуже того, побочные эффекты в таком выражении выполнятся всегда — источник неочевидных багов. Правило простое: константа или уже готовая ссылка — orElse; любое вычисление, обращение к внешней системе или создание объекта — orElseGet. Тот же принцип действует для orElseThrow, который принимает поставщика исключения именно поэтому: строить стектрейс на каждом успешном вызове не нужно.

Что хотят услышать

  • Когда вычисляется аргумент.
  • Практическое правило.

Частые ошибки

  • Ставить в orElse вызов метода с побочным эффектом.
  • Считать выбор между ними исключительно стилистическим.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Аргумент orElse вычисляется всегда, даже когда значение присутствует; orElseGet вызывает поставщика только при отсутствии значения
  • ✗orElse работает только с примитивами, orElseGet — с объектами
  • ✗orElse бросает исключение при пустом Optional
  • ✗Разницы нет, orElseGet добавлен для удобства записи

Что спросят дальше

  • Почему orElseThrow принимает поставщика?
  • Чем map отличается от flatMap у Optional?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем