Ответ
Метод Stream.flatMap() принимает на вход функцию-маппер, которая преобразует каждый элемент потока в новый поток (Stream).
Сигнатура:
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
mapper: Функция, принимающая элемент типаTи возвращающаяStream<R>. Это ключевое отличие отmap(), которая возвращает просто элементR.- Назначение: Эта функция "разворачивает" каждый элемент. Если элемент представляет собой коллекцию или контейнер, функция должна извлечь из него элементы и вернуть их как отдельный поток.
Практический пример:
List<String> words = Arrays.asList("Hello", "World");
// Функция-маппер: принимает String (слово), возвращает Stream<String> (поток букв)
List<String> letters = words.stream()
.flatMap(word -> word.chars() // Получаем IntStream кодов символов
.mapToObj(c -> String.valueOf((char) c)) // Преобразуем каждый код в String
) // Теперь у нас один объединенный Stream<String> из всех букв
.toList(); // Результат: ["H", "e", "l", "l", "o", "W", "o", "r", "l", "d"]
Почему именно Function, возвращающая Stream? Потому что flatMap() затем автоматически сглаживает (объединяет) все возвращенные потоки в один результирующий поток, избавляя разработчика от ручной работы с вложенными структурами.