Optional.ifPresentOrElse()
Обработка обоих случаев Optional — наличие и отсутствие значения — в одном вызове.
Сравнение кода
✕ Java 8
Optional<User> user = findUser(id);
if (user.isPresent()) {
greet(user.get());
} else {
handleMissing();
}
✓ Java 9+
findUser(id).ifPresentOrElse(
this::greet,
this::handleMissing
);
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Единое выражение
Оба случая обрабатываются в одном вызове метода.
Без get()
Устраняет опасный паттерн isPresent() + get().
Цепочный
Естественно связывается после findUser() или любого метода, возвращающего Optional.
Старый подход
if/else с Optional
Современный подход
ifPresentOrElse()
Начиная с JDK
9
Сложность
Начинающий
Поддержка JDK
Optional.ifPresentOrElse()
Доступно
Широко доступно с JDK 9 (сент. 2017)
Как это работает
ifPresentOrElse() принимает Consumer для случая наличия значения и Runnable для случая пустого Optional. Устраняет антипаттерн isPresent/get.
Связанная документация
Доказательство