JDK8-2-流(2.2)- 流操作-flatMap

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)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值