java.util.stream map和flatmap的区别

Posted

tags:

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

<R> Stream<R> map(Function<? super T,? extends R> mapper)
map 对每个流元素(T)调用给定函数(T -> R),得到新的元素(R),然后返回包含它们的一个新的流(Stream<R>)
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)

flatMap 对每个流元素(T)调用给定函数(T -> Stream<R>),得到很多流(Stream<R>),然后把这些流(Stream<R>)拼起来返回
参考技术A Stream是元素的集合,这点让Stream看起来用些类似Iterator;
可以支持顺序和并行的对原Stream进行汇聚的操作;
大家可以把Stream当成一个高级版本的Iterator。原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,具体这些操作如何应用到每个元素上,就给Stream就好了!(这个秘籍,一般人我不告诉他:))大家看完这些可能对Stream还没有一个直观的认识,莫急,咱们来段代码。
//Lists是Guava中的一个工具类
List<Integer> nums = Lists.newArrayList(1,null,3,4,null,6);
nums.stream().filter(num -> num != null).count();

上面这段代码是获取一个List中,元素不为null的个数。这段代码虽然很简短,但是却是一个很好的入门级别的例子来体现如何使用Stream,正所谓“麻雀虽小五脏俱全”。我们现在开始深入解刨这个例子,完成以后你可能可以基本掌握Stream的用法!
1.1 剖析Stream通用语法

图片就是对于Stream例子的一个解析,可以很清楚的看见:原本一条语句被三种颜色的框分割成了三个部分。红色框中的语句是一个Stream的生命开始的地方,负责创建一个Stream实例;绿色框中的语句是赋予Stream灵魂的地方,把一个Stream转换成另外一个Stream,红框的语句生成的是一个包含所有nums变量的Stream,进过绿框的filter方法以后,重新生成了一个过滤掉原nums列表所有null以后的Stream;蓝色框中的语句是丰收的地方,把Stream的里面包含的内容按照某种算法来汇聚成一个值,例子中是获取Stream中包含的元素个数。如果这样解析以后,还不理解,那就只能动用“核武器”–图形化,一图抵千言!

以上是关于java.util.stream map和flatmap的区别的主要内容,如果未能解决你的问题,请参考以下文章

java8 函数式编程入门官方文档中文版 java.util.stream 中文版 流处理的相关概念

使用 JDK8 和 lambda (java.util.stream.Streams.zip) 压缩流

tf.data.Dataset.interleave() 与 map() 和 flat_map() 究竟有何不同?

jdk1.8 java.util.stream.Stream类 详解

jdk1.8 java.util.stream

java.util.stream.Stream 接口中的常用方法