Обычный вариант быстро разрастается:
User user = userRepository.findByEmail(email);
if (user != null) {
Address address = user.getAddress();
if (address != null) {
return address.getCity();
}
}
return "unknown";
Проблема не только в количестве строк.
В таких вложенных
if легко забыть один уровень проверки и получить NPE в самом неожиданном месте.С
Optional это можно записать короче и безопаснее:
return userRepository.findByEmail(email)
.map(User::getAddress)
.map(Address::getCity)
.orElse("unknown");
Каждый
map() выполняется только если предыдущее значение существует.Если пользователя нет, адреса нет или город не задан - цепочка спокойно дойдёт до
orElse().Для таких случаев
Optional хорошо работает как способ явно показать:значение может отсутствовать, и это нормальная часть логики.
Главное не превращать
Optional в новую религию.Он особенно полезен на границах методов и в цепочках, где каждый следующий шаг может вернуть
null.
