JDK8-2-流(2.2)- 流操作-flatMap
flatMap (流的扁平化处理)
例1
假设有一个需求,需要将 [“Hello”,“World”] 字符串数组转换成没有重复字母的单个字母组成的字符串数组 [“H”,“e”,“l”, “o”,“W”,“r”,“d”],如何处理呢,有可能第一想法是使用 map 处理,但是map其实不能达到想要的效果,它会使集合嵌套,如下:
List<List<String>> result2 = Arrays.stream(WORDS)
.map(str -> Arrays.asList(str.split("")))
.collect(Collectors.toList());
使用 flatMap 处理
public static void flatMapTest1() {
List<String> result = Arrays.stream(WORDS)
.map(str -> str.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(Collectors.toList());
System.out.println(result);
}
flatmap方法可以把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流,以上例说明,就是将 String [] 转换成 Stream <String> 然后合并这两个流。
flatMap 定义
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
flatMap 方法效果图
例2
给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。
代码如下:
c 代表数对 int[] 的集合,d 表示将数对转换成字符串的集合
List<Integer> a = Arrays.asList(1, 2, 3);
List<Integer> b = Arrays.asList(3, 4);
List<int[]> c = a.stream().flatMap(i -> b.stream().map(j -> new int[]{i, j})).collect(Collectors.toList());
List<String> d = c.stream()
.map(arr -> new StringJoiner(",", "(", ")").add(Integer.toString(arr[0])).add(Integer.toString(arr[1])).toString())
.collect(Collectors.toList());
System.out.println(d);
结果:
[(1,3), (1,4), (2,3), (2,4), (3,3), (3,4)]