Gymterview
junior

Для чего в стримах предназначены методы flatMap, flatMapToInt, flatMapToDouble, flatMapToLong?

flatMap() — промежуточная операция, которая преобразует каждый элемент в стрим, а затем объединяет (выпрямляет) все полученные стримы в один. Это ключевое отличие от map(): если map() преобразует элемент в один элемент, то flatMap() — в ноль, один или несколько элементов.

Аналогия из жизни: map — это перевод каждого письма на другой язык (одно письмо на входе, одно на выходе). flatMap — это вскрытие конвертов с несколькими листами и раскладывание всех листов в одну стопку.

Пример
Stream.of("H e l l o", "w o r l d")
    .flatMap(s -> Arrays.stream(s.split(" ")))
    .toArray(String[]::new);
// ["H", "e", "l", "l", "o", "w", "o", "r", "l", "d"]

Типичные сценарии:

  • Объединение вложенных коллекций: listOfLists.stream().flatMap(Collection::stream)
  • Разбиение строк на слова/символы
  • Развёртывание Optional (до Java 9): optional.map(...).flatMap(...)

flatMapToInt(), flatMapToDouble(), flatMapToLong() — аналоги, возвращающие соответствующий примитивный стрим.

На собеседовании: часто просят объяснить разницу между map и flatMap. Ответ: map оборачивает результат функции в стрим, flatMap — «выпрямляет» вложенный стрим. Если функция возвращает коллекцию, map даст Stream<List<T>>, а flatMapStream<T>.