Создание и проверка Optional
Безопасно используйте Optional.of, ofNullable, empty, isPresent, isEmpty и get.
«Создание и проверка Optional» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Создание и проверка Optional
В этом уроке рассматриваются методы создания экземпляров Optional и проверки их содержимого: isPresent, isEmpty, get и безопасные альтернативы.
Три способа создать Optional
Создайте Optional с помощью Optional.of(), Optional.ofNullable() или Optional.empty().
import java.util.Optional;
// 1. of: must be non-null
Optional<String> a = Optional.of("hello");
// 2. ofNullable: safely wraps null
String maybeNull = null;
Optional<String> b = Optional.ofNullable(maybeNull); // empty
Optional<String> c = Optional.ofNullable("world"); // present
// 3. empty: explicitly empty
Optional<Integer> empty = Optional.empty();
System.out.println(a.isPresent()); // true
System.out.println(b.isPresent()); // false
System.out.println(c.isEmpty()); // falseisPresent и isEmpty
isPresent() возвращает true, если значение присутствует. isEmpty() (Java 11 и новее) является логическим отрицанием этого метода.
import java.util.Optional;
Optional<String> opt = Optional.of("Java");
System.out.println(opt.isPresent()); // true
System.out.println(opt.isEmpty()); // false
Optional<String> empty = Optional.empty();
System.out.println(empty.isPresent()); // false
System.out.println(empty.isEmpty()); // true
// Prefer ifPresent() over if (isPresent()) get() — more readable
opt.ifPresent(v -> System.out.println(v.toUpperCase())); // JAVAget(): используйте с осторожностью
get() возвращает значение или выбрасывает NoSuchElementException. Никогда не вызывайте его без предварительной проверки.
import java.util.Optional;
Optional<String> opt = Optional.of("present");
System.out.println(opt.get()); // present
Optional<String> empty = Optional.empty();
try {
empty.get(); // NoSuchElementException!
} catch (java.util.NoSuchElementException e) {
System.out.println("No value!");
}
// Better pattern: always use orElse/orElseGet/orElseThrow
// instead of isPresent() + get()orElse и orElseGet
orElse(default) возвращает значение по умолчанию, если Optional пуст. orElseGet(supplier) лениво вызывает поставщик — это лучше подходит для дорогих значений по умолчанию.
import java.util.Optional;
Optional<String> plan = Optional.empty();
// orElse: default value always evaluated
String basic = plan.orElse("FREE");
System.out.println(basic); // FREE
// orElseGet: supplier only called when empty (lazy)
String lazy = plan.orElseGet(() -> {
System.out.println("Computing default...");
return "FREE";
});
System.out.println(lazy); // Computing default... FREE
// When present, orElseGet supplier is NOT called
Optional.of("PRO").orElseGet(() -> {
System.out.println("Not called!");
return "FREE";
}); // silent — present, no computation neededorElseThrow
orElseThrow() выбрасывает NoSuchElementException или пользовательское исключение, если Optional пуст. Используйте его, когда отсутствие значения действительно является ошибкой.
import java.util.Optional;
Optional<String> userId = Optional.empty();
// Default: throws NoSuchElementException
try {
userId.orElseThrow();
} catch (java.util.NoSuchElementException e) {
System.out.println("Empty!");
}
// Custom exception
try {
userId.orElseThrow(() -> new IllegalStateException("User ID required"));
} catch (IllegalStateException e) {
System.out.println(e.getMessage()); // User ID required
}ifPresent и ifPresentOrElse
Эти методы позволяют выполнить действие над значением, не извлекая его. Они удобны для побочных эффектов.
import java.util.Optional;
Optional<String> username = Optional.of("alice");
// ifPresent: callback only when present
username.ifPresent(u -> System.out.println("Welcome, " + u));
// Welcome, alice
Optional<String> missing = Optional.empty();
// ifPresentOrElse (Java 9+): callback or else action
missing.ifPresentOrElse(
u -> System.out.println("Hello " + u),
() -> System.out.println("Anonymous user")
);
// Anonymous userПроверка наличия String
Распространённый случай использования: возврат значения по умолчанию, когда строка конфигурации отсутствует или пуста.
import java.util.Optional;
static Optional<String> getConfig(String key) {
// Simulate config lookup
return Optional.ofNullable(System.getenv(key));
}
String port = getConfig("PORT").orElse("8080");
String host = getConfig("HOST").orElse("localhost");
System.out.println("Server: " + host + ":" + port);
// Server: localhost:8080 (when env vars not set)Optional.or() для альтернативных Optional
or() (Java 9 и новее) возвращает сам Optional, если значение присутствует, или другой Optional, предоставленный поставщиком.
import java.util.Optional;
static Optional<String> findInCache(String key) { return Optional.empty(); }
static Optional<String> findInDatabase(String key) { return Optional.of("Alice"); }
Optional<String> result = findInCache("user:1")
.or(() -> findInDatabase("user:1"));
System.out.println(result.get()); // Alice
// Useful for fallback chains:
Optional<String> value = Optional.empty()
.or(() -> Optional.empty())
.or(() -> Optional.of("final fallback"));
System.out.println(value.get()); // final fallbackfilter для условного наличия
filter(predicate) сохраняет значение, только если оно удовлетворяет предикату, иначе возвращает пустой Optional.
import java.util.Optional;
Optional<Integer> age = Optional.of(17);
Optional<Integer> adult = age.filter(a -> a >= 18);
System.out.println(adult.isPresent()); // false (17 is not >= 18)
Optional<Integer> age2 = Optional.of(25);
Optional<Integer> adult2 = age2.filter(a -> a >= 18);
System.out.println(adult2.get()); // 25
// Chain: find active premium user
Optional<User> premiumActive = findUser(id)
.filter(u -> "PRO".equals(u.plan()))
.filter(u -> u.isActive());Практика: поиск пользователя с резервным вариантом
Сочетание isPresent, orElse и ifPresentOrElse в реалистичном сценарии поиска пользователя.
import java.util.Optional;
record User(long id, String name, String email) {}
static Optional<User> findById(long id) {
return id == 1 ? Optional.of(new User(1, "Alice", "alice@co.com"))
: Optional.empty();
}
static void displayUser(long id) {
findById(id).ifPresentOrElse(
u -> System.out.println("Found: " + u.name() + " <" + u.email() + ">"),
() -> System.out.println("User " + id + " not found")
);
}
displayUser(1); // Found: Alice <alice@co.com>
displayUser(99); // User 99 not foundБыстрая проверка
Чем orElseGet() отличается от orElse()?
Итоги: создание и проверка Optional
Главные выводы:
- Optional.of() требует ненулевого значения, а Optional.ofNullable() принимает null
- isPresent() / isEmpty() проверяют наличие значения; не вызывайте get() без предварительной проверки
- Используйте orElse() для дешёвых значений по умолчанию, а orElseGet() — для дорогих вычисляемых значений
- Используйте orElseThrow(), когда отсутствие значения является ошибкой
- Используйте ifPresent() и ifPresentOrElse() для побочных эффектов без извлечения значения
- filter() сохраняет значение, только если предикат выполняется, а or() объединяет резервные Optional
Часто задаваемые вопросы
Урок «Создание и проверка Optional» бесплатный?
Да — полный текст урока «Создание и проверка Optional» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Создание и проверка Optional»?
Безопасно используйте Optional.of, ofNullable, empty, isPresent, isEmpty и get. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Создание и проверка Optional»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужен Optional
- Создание и проверка Optional
- Преобразование Optional: map и flatMap
- Рекомендации по использованию Optional