Короткий ответ
Optional — контейнерный класс из пакета java.util, появившийся в Java 8: он содержит либо одно ненулевое значение, либо пуст. Его задача — сделать возможное отсутствие значения явным в сигнатуре метода и избавить код от бесконечных проверок на null и от NullPointerException: вместо возврата null метод возвращает Optional.empty().
Как это работает подробнее
Создать Optional можно тремя способами: Optional.of(value) — только для заведомо ненулевого значения, иначе сразу NullPointerException; Optional.ofNullable(value) — допускает null и превращает его в пустой Optional; Optional.empty() — пустой контейнер.
Для проверки наличия значения есть isPresent() и isEmpty() (с Java 11). Для безопасного получения — orElse(default), orElseGet(supplier), когда значение по умолчанию вычисляется лениво, и orElseThrow(). Методы map(), filter() и flatMap() позволяют преобразовывать значение внутри контейнера без проверок.
- Optional активно используется в Stream API: findFirst(), max() и другие терминальные операции возвращают Optional.
- Хранить Optional в полях класса, аргументах методов и коллекциях не рекомендуется — он задуман прежде всего для возвращаемых значений.
Пример кода
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<String> email = Optional.ofNullable(findEmail());
// вместо: if (email != null) { ... }
email.ifPresent(System.out::println);
String result = email.orElse("no-email@example.com");
String upper = email.map(String::toUpperCase)
.orElse("N/A");
}
static String findEmail() {
return null; // или реальный поиск
}
}Что использовать на практике
- Возвращайте Optional из методов, где отсутствие результата — нормальная ситуация, а не ошибка.