Какой метод в Java Optional проверяет наличие значения?

«Какой метод в Java Optional проверяет наличие значения?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для проверки наличия значения в Optional<T> используются два основных метода:

  1. boolean isPresent() — возвращает true, если значение присутствует.
  2. 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().