Gymterview
junior

Что такое Optional?

Optional<T> — контейнер-обёртка, который может содержать или не содержать ненулевое значение. Он предоставляет декларативный способ работы с потенциально отсутствующими значениями вместо ручных if (x != null) проверок, что снижает вероятность NullPointerException.

Аналогия из жизни: Optional — это коробка, на которой написано «может быть пустой». Прежде чем достать содержимое, вы проверяете, есть ли что-то внутри, или определяете, что делать, если коробка пуста.

Пример
Optional<String> optional = Optional.of("hello");

optional.isPresent();                              // true
optional.ifPresent(s -> System.out.println(s));    // hello
optional.get();                                     // "hello"
optional.orElse("default");                         // "hello"
optional.map(String::toUpperCase).orElse("");       // "HELLO"

Основные способы создания

Метод Описание
Optional.of(value) Оборачивает ненулевое значение (NPE если null)
Optional.ofNullable(value) Оборачивает значение, допуская null
Optional.empty() Возвращает пустой Optional

Основные методы

Метод Описание
isPresent() Возвращает true, если значение есть
ifPresent(consumer) Выполняет действие, если значение есть
get() Возвращает значение или бросает NoSuchElementException
orElse(default) Возвращает значение или дефолт
orElseGet(supplier) Возвращает значение или вычисляет дефолт лениво
orElseThrow(supplier) Возвращает значение или бросает исключение
map(function) Преобразует значение, если оно есть
flatMap(function) Как map, но функция сама возвращает Optional
filter(predicate) Возвращает Optional, если значение удовлетворяет условию

На собеседовании: не используйте Optional как поле класса, параметр метода или элемент коллекции — он предназначен исключительно для возвращаемых значений. Также важно различать orElse() (вычисляет дефолт всегда) и orElseGet() (вычисляет лениво).