Для чего предназначен Optional?
- Зачем нужен Optional?
- Как правильно использовать Optional?
- Можно ли использовать Optional в полях класса?
Optional — контейнер «значение или пусто», который явно говорит, что результата может не быть, и заставляет это обработать.
- Работа:
map,filter,orElse,orElseGet,orElseThrow,ifPresent - Предназначен для возвращаемых значений, а не для полей и параметров
А ещё optional.get() без проверки — тот же NPE, только под другим названием
Подробно
Метод, который может ничего не найти, раньше возвращал null — и вызывающий легко забывал проверку, получая NullPointerException в неожиданном месте. Optional<T> делает отсутствие значения частью типа: по сигнатуре Optional<User> findById(long id) сразу видно, что пользователя может не быть.
Обработка без явных проверок:
mapиflatMap— преобразовать значение, если оно есть;filter— отбросить по условию;orElse(default)— значение по умолчанию (вычисляется всегда);orElseGet(supplier)— значение по умолчанию лениво;orElseThrow()— бросить исключение при отсутствии;ifPresent/ifPresentOrElse— выполнить действие.
Рекомендации: использовать как тип возвращаемого значения; не делать полями класса и параметрами методов; не возвращать null вместо Optional; для коллекций возвращать пустую коллекцию, а не Optional<List>. Для примитивов есть OptionalInt и подобные.
Пример
String city = userRepository.findById(id)
.map(User::getAddress)
.map(Address::getCity)
.orElse("не указан");
User user = userRepository.findById(id)
.orElseThrow(() -> new NotFoundException("user " + id));Что хотят услышать
- Назначение: явно выразить возможное отсутствие значения.
- Основные методы обработки без get().
- Где уместен (возвращаемое значение) и где нет (поля, параметры, коллекции).
- Разница orElse и orElseGet — плюс.
Частые ошибки
- Вызывать get() без проверки.
- Использовать Optional как поле сущности.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Ускорить обработку коллекций и стримов за счёт ленивости
- ✓Явно выразить, что значения может не быть
- ✗Полностью заменить null во всех полях и параметрах
- ✗Сделать поля потокобезопасными без синхронизации
Что спросят дальше
- Чем orElse отличается от orElseGet?
- Почему Optional не сериализуют?
Разбор темы
- Optional: явное отсутствие значения
Зачем Optional, orElse против orElseGet, композиция map/flatMap/filter и антипаттерны использования.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.