Ответ
Для проверки наличия значения в 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().
Ответ 18+ 🔞
Слушай, а вот этот твой 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 — нихуя нету
Но вот тут, блядь, главный подвох! Если ты делаешь так:
if (optional.isPresent()) {
String value = optional.get(); // ААААА, ДА КАКОГО ХУЯ?!
// ...
}
То ты — мудак. Серьёзно. Это антипаттерн, ёпта. Ты сначала проверяешь, а потом лезешь get()-ом. А если забудешь проверить? Пиздец, NoSuchElementException тебе в сраку. Весь смысл Optional — чтобы НЕ делать такую хуйню!
Вот как надо, умник:
// 1. ifPresent() — если есть, сделай с ним что-то, а нет — да похуй
optional.ifPresent(value -> System.out.println("Нашёл: " + value));
// 2. orElse() — дай значение, а если пусто — на, вот тебе заглушка
String result = optional.orElse("дефолтное_говно");
// 3. orElseGet() — ленивая заглушка, чтобы не вычислять её, если не надо
String result = optional.orElseGet(() -> дорогая_операция_расчёта_говна());
// 4. orElseThrow() — если пусто, то пиздуй с исключением
String result = optional.orElseThrow(() -> new NotFoundException("Чё-то не нашёл, бля"));
// 5. map() и flatMap() — если есть значение, преобразуй его, нет — так нет
Optional<Integer> length = optional.map(String::length); // Длина, если строка была
Короче, вывод, блядь: методы isPresent() и isEmpty() — это как спросить «а можно?». Используй их, если тебе просто нужен ответ «да» или «нет». А если тебе нужно что-то сделать с тем, что внутри — не будь идиотом, используй ifPresent(), orElse*(), map() и flatMap(). Они для того и придуманы, чтобы ты не выёбывался с get() и не ловил исключения там, где нихуя не должно падать. Всё, вопрос закрыт.