Sobes.tech
Назад к вопросам
Junior — Middle
73

Как соотносятся методы flatMap в классах Optional и Stream в Java?

Компании, где спрашивали
Тетрасофт

Ответ от нейросети

sobes.tech AI

Метод flatMap в классах Optional и Stream в Java служит для схожей цели — преобразования и "расплющивания" вложенных структур, но применяется в разных контекстах.

  • В Stream<T> метод flatMap принимает функцию, которая для каждого элемента возвращает поток (Stream<U>), и объединяет все эти потоки в один плоский поток (Stream<U>). Это удобно, когда каждый элемент исходного потока может соответствовать множеству элементов в результирующем потоке.

  • В Optional<T> метод flatMap принимает функцию, возвращающую Optional<U>, и если исходный Optional не пуст, возвращает результат этой функции, иначе — пустой Optional. Это позволяет избежать вложенных Optional<Optional<U>>.

Пример для Stream:

List<List<String>> list = List.of(List.of("a", "b"), List.of("c", "d"));
List<String> flat = list.stream()
    .flatMap(Collection::stream)
    .collect(Collectors.toList()); // ["a", "b", "c", "d"]

Пример для Optional:

Optional<String> optional = Optional.of("123");
Optional<Integer> result = optional.flatMap(s -> {
    try {
        return Optional.of(Integer.parseInt(s));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
});

Таким образом, оба метода "расплющивают" вложенные структуры, но Stream.flatMap работает с потоками элементов, а Optional.flatMap — с вложенными опциональными значениями.