Вопрос проверяет понимание различий между map и flatMap и умение работать с вложенными структурами.
flatMap нужен, когда один элемент преобразуется в несколько элементов или в поток элементов. map в таких случаях создаёт вложенные структуры, например Stream<Stream<T>>. flatMap разворачивает эти структуры в один поток. Это упрощает дальнейшую обработку. Поэтому он незаменим при работе с коллекциями внутри коллекций.
Разница между map и flatMap проявляется при работе с вложенными данными.
map:
преобразует один элемент в один результат
сохраняет структуру потока
Пример результата:
Stream<List<String>>
Это неудобно для фильтрации и агрегации.
flatMap:
преобразует элемент в поток элементов
объединяет все результаты в один Stream
Результат:
Stream<String>
flatMap необходим, когда:
у объекта есть коллекция значений
данные приходят в виде списков списков
нужно «расплющить» структуру
Пример:
List<List<String>> data = ...
data.stream()
.flatMap(List::stream)
.forEach(...);
Использование map приводит к:
вложенным Stream
усложнению кода
необходимости дополнительных циклов
flatMap решает это декларативно.
Вывод: flatMap нужен для работы с вложенными потоками и превращения их в единый поток данных.