Ответ вслух Middle Лямбды и Stream API обновлено

Optional: как правильно

Вопрос

Зачем нужен Optional и как его правильно использовать?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Optional делает отсутствие значения частью сигнатуры: метод Optional<User findByEmail честно говорит, что пользователя может не быть, и вызывающий не забудет это обработать. Использую его только как возвращаемый тип.

Что должно прозвучать в ответе

  • Явно показывает в сигнатуре, что значения может не быть

  • Для возвращаемых значений, не для полей, параметров и коллекций

  • map/filter/flatMap вместо проверок на null

  • orElse вычисляется всегда, orElseGet лениво

  • orElseThrow вместо get

  • Не возвращать null вместо Optional, для коллекций пустая коллекция

Что могут спросить следом

  • Почему Optional не Serializable?
  • Что такое OptionalInt и зачем он?

Разбор

Optional делает отсутствие значения частью сигнатуры: метод Optional<User> findByEmail честно говорит, что пользователя может не быть, и вызывающий не забудет это обработать. Использую его только как возвращаемый тип. В полях, параметрах и коллекциях он не нужен: поле может быть null внутри класса, параметр лучше перегрузить, а для коллекций есть пустая коллекция. Вместо isPresent и get пишу цепочки: map, filter, orElseThrow. Важная тонкость: orElse(x) вычисляет x всегда, поэтому для дорогих значений orElseGet с лямбдой. И метод, возвращающий Optional, никогда не должен вернуть null.

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

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