Optional: как правильно
Вопрос
Зачем нужен Optional и как его правильно использовать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Явно показывает в сигнатуре, что значения может не быть
Для возвращаемых значений, не для полей, параметров и коллекций
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 ошибок.