Ответ
Метод flatMap работает с элементами потока (Stream<T>), которые сами являются контейнерами или могут быть преобразованы в потоки. Его задача — "развернуть" вложенную структуру.
Основной сценарий: Преобразование Stream<Collection<T>> или Stream<Stream<R>> в Stream<R>.
Пример: Разворот списка списков
List<List<String>> nestedList = List.of(
List.of("a", "b"),
List.of("c", "d")
);
List<String> flatList = nestedList.stream()
.flatMap(Collection::stream) // Преобразуем каждый List в Stream
.toList(); // Результат: ["a", "b", "c", "d"]
Другие применения:
Optional<T>:Optional::streamилиoptional.flatMap(...)для цепочки вычислений, возвращающихOptional.CompletableFuture<T>: Для асинхронных цепочек, где каждая операция возвращает новыйFuture.
Ключевое отличие от map: map преобразует T -> R, а flatMap преобразует T -> Stream<R>, а затем объединяет (flattens) все полученные потоки в один.