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