java8中的map与flatmap

这篇博客探讨了在Java中如何使用Stream API处理字符串列表。通过一个具体的需求——将单词列表拆分成单个字符列表,分析了map和flatMap的区别。map方法用于对流中的每个元素应用转换函数,而flatMap则将每个元素转换为流并合并这些流。在解决初始问题时,使用flatMap能正确地将单词拆分成字符流。最终代码示例展示了如何正确使用flatMap实现需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

假如我们有这样一个需求给定单词列表[“Hello”,“World”],你想要返回列表[“H”,“e”,“l”, “o”,“W”,“r”,“d”],如果我们使用java实现这个需求,你会怎么实现呢?可能我们第一个想法是下面这种写法:

words.stream()
.map(word -> word.split(“”))
.distinct()
.collect(toList());

但是如果我们运行会发现这样的写法是不正确的,这个方法的问题在于,传递给map方法的Lambda为每个单词返回了一个String[](String列表)。因此, map 返回的流实际上是Stream类型的。你真正想要的是用
Stream来表示一个字符流。因此,这是行不通的。

我们带着上面的问题进行下面的分析:

map和flatmap的区别

map:对于stream中包含的元素使用 特定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是mapToInt,mapToLong和mapToDouble.这三个方法比较好理解,比如mapToInt就是把原始的Stream转换成一个新的Stream,这个新生成的Stream中的元素map方法示意图:

flatMap:和map类似,不同的是每个元素 转换得到是Stream对象,会把子Stream中的元素压缩到父集合中:

flatMap方法示意图:

如果我们用一句话来总结flatmap:

把几个小的list转换成一个大的list

解决问题:

对于我们开始提出的问题,我们分为两步来完成:

1、分隔字符串,将数据中的字母都分隔开,形成多个小list新的stream

2、组装成新的list

        String[] strings = {"Hello", "World"};
        List<String> collect = Stream.of(strings)
                .map(s -> s.split(""))
                .flatMap(s -> Stream.of(s))
                .distinct()
                .collect(Collectors.toList());

        collect.forEach(c->{
            System.out.println(c);
        });

这样我们就可以很好地理解map和flatmap的区别了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值