Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования