Преобразование через flatMap в Java
Иногда функция сама возвращает Optional: поиск
по ключу, разбор строки, шаг цепочки репозиториев.
map дал бы тип Optional<Optional<T>>.
flatMap «разворачивает» один уровень и
оставляет один контейнер.
Поиск города по коду страны и коду города:
import java.util.Optional;
Optional<String> findCountry(String code) {
return "RU".equals(code)
? Optional.of("Russia")
: Optional.empty();
}
Optional<String> findCity(String country, String cityCode) {
if ("Russia".equals(country) && "SPB".equals(cityCode)) {
return Optional.of("Saint Petersburg");
}
return Optional.empty();
}
Optional<String> cityName(String countryCode, String cityCode) {
return findCountry(countryCode)
.flatMap(country -> findCity(country, cityCode));
}
Если страна не найдена, flatMap не зовет поиск
города. Если страна есть, но город нет, наружу уходит
пустой контейнер без вложенности.
Метод Optional<String> upper(Optional<String> s)
возвращает пустой контейнер для пустого входа,
иначе контейнер со строкой в верхнем регистре.
Обработайте контейнер со строкой "hi"
и выведите значение или "?".