С какими типами данных работает метод flatMap в Java Stream API?

«С какими типами данных работает метод flatMap в Java Stream API?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод 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) все полученные потоки в один.