Ответ
Для проверки наличия значения в Optional<T> используются два основных метода:
boolean isPresent()— возвращаетtrue, если значение присутствует.boolean isEmpty()(добавлен в Java 11) — возвращаетtrue, если значение отсутствует. Является более читаемой альтернативой!isPresent().
Примеры базового использования:
Optional<String> fullName = Optional.of("John Doe");
Optional<String> emptyName = Optional.empty();
System.out.println(fullName.isPresent()); // true
System.out.println(emptyName.isEmpty()); // true (Java 11+)
System.out.println(emptyName.isPresent()); // false
Важное замечание: Прямое использование isPresent() с последующим get() считается антипаттерном, так как приводит к императивному стилю и не использует преимущества Optional для безопасной обработки null.
Правильные альтернативы (предпочтительный стиль):
// АНТИПАТТЕРН: Не делайте так
if (optional.isPresent()) {
String value = optional.get(); // Небезопасно, если забыть проверку
// ...
}
// ПРАВИЛЬНЫЕ ПОДХОДЫ:
// 1. ifPresent() - выполнить действие, если значение есть
optional.ifPresent(value -> System.out.println("Found: " + value));
// 2. orElse() - получить значение или значение по умолчанию
String result = optional.orElse("default");
// 3. orElseGet() - ленивое вычисление значения по умолчанию
String result = optional.orElseGet(() -> expensiveDefaultCalculation());
// 4. orElseThrow() - выбросить исключение, если значения нет
String result = optional.orElseThrow(() -> new NotFoundException("Value missing"));
// 5. map() и flatMap() - преобразовать значение, если оно есть
Optional<Integer> length = optional.map(String::length);
Вывод: Используйте isPresent()/isEmpty() только когда необходима простая проверка без последующего извлечения. Для большинства операций извлечения или преобразования значения применяйте методы ifPresent(), orElse*(), map() и flatMap().