Выбор ответа Middle Лямбды и Stream API спрашивают часто обновлено

orElse и orElseGet

Вопрос

Когда вызовется loadDefault() в optional.orElse(loadDefault())?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Всегда, даже если в Optional есть значение. Аргумент метода вычисляется до вызова, поэтому loadDefault() выполнится в любом случае, а результат просто будет отброшен, если значение есть.

Варианты ответа

  1. Всегда, даже если в Optional есть значениеправильный ответ
  2. Только если Optional пуст
  3. Никогда, если Optional создан через Optional.of
  4. Только при первом обращении, дальше значение кешируется

Разбор

Аргумент метода вычисляется до вызова, поэтому loadDefault() выполнится в любом случае, а результат просто будет отброшен, если значение есть. Если вычисление дорогое или с побочным эффектом, нужен orElseGet(this::loadDefault): Supplier вызывается только для пустого Optional. Никакого кеширования нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.