Для чего в стримах предназначены методы 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>>, аflatMap—Stream<T>.