java8中的map与flatmap

Posted 程序员超时空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8中的map与flatmap相关的知识,希望对你有一定的参考价值。

问题

假如我们有这样一个需求给定单词列表[“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的区别了

创作挑战赛 新人创作奖励来咯,坚持创作打卡瓜分现金大奖

以上是关于java8中的map与flatmap的主要内容,如果未能解决你的问题,请参考以下文章

Java8Stream的flatmap方法使用

JAVA8 flatMap和map的区别

JAVA8 flatMap和map的区别

Java8中map()和flatMap()的区别

别告诉我Java8都出来这么久了,你还搞不懂Stream的map和flatmap的区别?

java8 stream limit distinct map flatMap