Middle
121
questionbank
Что вы знаете о классе Optional?
Ответ от нейросети
sobes.tech AI
Optional<T> - это контейнерный класс, который может содержать либо непустое значение типа T, либо быть пустым. Был добавлен в Java 8 для решения проблемы null-указателей.
Основные методы:
of(T value): СоздаетOptionalс непустым значением. БросаетNullPointerExceptionесли значениеnull.ofNullable(T value): СоздаетOptionalс непустым значением, если оно есть, или пустойOptionalесли значениеnull.empty(): Создает пустойOptional.isPresent(): Возвращаетtrue, если значение присутствует, иначеfalse.isEmpty(): Возвращаетtrue, если значение отсутствует, иначеfalse(добавлено в Java 11).get(): Возвращает значение, если оно присутствует, иначе бросаетNoSuchElementException.orElse(T other): Возвращает значение, если оно присутствует, иначе возвращаетother.orElseGet(Supplier<? extends T> other): Возвращает значение, если оно присутствует, иначе возвращает результат выполненияSupplier. ПредпочтительнееorElse(T other)при дорогостоящей инициализацииother.orElseThrow(Supplier<? extends X> exceptionSupplier): Возвращает значение, если оно присутствует, иначе бросает исключение, полученное отexceptionSupplier.
Пример использования для избежания NullPointerException:
// Вместо
User user = findUserById(userId);
if (user != null) {
String email = user.getEmail();
// ...
}
// Можно использовать Optional
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
String email = user.getEmail();
// ...
});
Сравнение orElse и orElseGet:
// Оба вызова вернут DefaultUser, если optionalUser пуст
// Но в случае orElse, new DefaultUser() будет вызван всегда,
// даже если optionalUser содержит значение
User user1 = optionalUser.orElse(new DefaultUser());
// В случае orElseGet, new DefaultUser() будет вызван только
// если optionalUser пуст
User user2 = optionalUser.orElseGet(() -> new DefaultUser());
Optional помогает сделать код более читаемым и безопасным, явно указывая, что значение может отсутствовать. Его не следует использовать для полей классов или параметров методов, если отсутствующее значение является исключительной ситуацией.