Метод flatMap
Метод flatMap класса Stream преобразует каждый элемент исходного потока в новый поток с помощью переданной функции и объединяет все эти потоки в один общий поток. В первый параметр мы передаем функцию-маппер, которая принимает элемент потока и возвращает новый поток. В отличие от метода map, который возвращает одно значение для каждого элемента, flatMap возвращает поток значений, которые затем «разворачиваются» в общий поток.
Синтаксис
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
Пример
Давайте преобразуем каждую строку потока в поток ее символов и объединим все в один поток:
import java.util.List;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abc", "de", "f");
Stream<String> res = list.stream()
.flatMap(s -> s.chars().mapToObj(c -> String.valueOf((char) c)));
res.forEach(System.out::println);
}
}
Результат выполнения кода:
"a"
"b"
"c"
"d"
"e"
"f"
Пример
Давайте развернем вложенные списки в один плоский список чисел:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<List<Integer>> list = List.of(
List.of(1, 2, 3),
List.of(4, 5),
List.of(6)
);
List<Integer> res = list.stream()
.flatMap(inner -> inner.stream())
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[1, 2, 3, 4, 5, 6]
Пример
Давайте с помощью flatMap разобьем каждую строку потока на слова и соберем их в один список:
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abc de", "f ghi", "jkl");
List<String> res = list.stream()
.flatMap(s -> Arrays.stream(s.split(" ")))
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
["abc", "de", "f", "ghi", "jkl"]