Метод flatMap
Метод flatMap класса Optional применяет
к значению функцию-преобразователь, которая возвращает
другой Optional, и сразу разворачивает результат.
Если исходный Optional пуст, метод возвращает
пустой Optional без вызова функции. В первый
параметр мы передаем функцию, принимающую значение
и возвращающую Optional. В отличие от метода
map, который оборачивает результат в Optional,
метод flatMap не создает дополнительной
вложенности.
Синтаксис
optional.flatMap(mapper)
Пример
Давайте сравним поведение map и flatMap
на одном и том же значении:
import java.util.Optional;
public class Main
{
public static void main(String[] args)
{
Optional<String> opt = Optional.of("abcde");
Optional<Optional<String>> mapRes = opt.map(s -> Optional.of(s.toUpperCase()));
Optional<String> flatMapRes = opt.flatMap(s -> Optional.of(s.toUpperCase()));
System.out.println(mapRes);
System.out.println(flatMapRes);
}
}
Результат выполнения кода:
Optional[Optional[ABCDE]]
Optional[ABCDE]
Пример
Давайте применим flatMap для извлечения
значения из вложенного Optional:
import java.util.Optional;
public class Main
{
public static void main(String[] args)
{
Optional<String> opt = Optional.of("abcde");
Optional<Integer> res = opt.flatMap(s -> Optional.of(s.length()));
System.out.println(res);
}
}
Результат выполнения кода:
Optional[5]
Пример
Если функция возвращает пустой Optional,
результат также будет пустым:
import java.util.Optional;
public class Main
{
public static void main(String[] args)
{
Optional<String> opt = Optional.of("abcde");
Optional<String> res = opt.flatMap(s -> Optional.empty());
System.out.println(res);
}
}
Результат выполнения кода:
Optional.empty
Пример
Если исходный Optional пуст, функция
не вызывается и результат остается пустым:
import java.util.Optional;
public class Main
{
public static void main(String[] args)
{
Optional<String> opt = Optional.empty();
Optional<Integer> res = opt.flatMap(s -> Optional.of(s.length()));
System.out.println(res);
}
}
Результат выполнения кода:
Optional.empty