Что является входным аргументом метода flatMap() в Java Stream API?

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

Ответ

Метод 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() затем автоматически сглаживает (объединяет) все возвращенные потоки в один результирующий поток, избавляя разработчика от ручной работы с вложенными структурами.