Java8的Stream中引入了对流的各种计算方法,其中map和flatMap的区别常常把人搞的晕头转向,本文对此进行分析。
<R> Stream<R> map(Function<? super T, ? extends R> mapper); <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
相同点:
Function Stream<R>
不同点:
Function
中的转换结果不同: map
为返回流中的元素 R
, flatMap
为一个继承了 Stream<? extends R>
类型,即它是一个 Stream
map
中 Function
返回的 R
会原封不动的放入流中,不管它是什么类型;而 flatMap
中 Function
返回的 Stream<R>
会被拆开放入到结果流中 OK,我们来看一个例子,假设我们有一个字符串数组
String[] strings = {"Hello", "World"};
使用 map
:
Stream<String[]> stream = Arrays.asList(strings).stream(). map(str -> str.split(""));
这里 map
返回的流实是 Stream<String[]>
类型的,因为传递给 map
方法的 lambda
为每个单词返回了一个 String[]
。
继续转换:
Stream<Stream<String>> streamStream = stream.map(strings1 -> Arrays.stream(strings1));
这里 map
又将 String[]
转化为了 Stream<String>
。
通过上面两个例子可以看出, map
的返回结果流的类型就是直接将转化结果放了进去,如果转换结果是集合或者数组,那么它不会帮你拆解,或者说 扁平化
。
使用 flatMap
:
Stream<String[]> stream1 = Arrays.asList(strings).stream(). map(str -> str.split("")); Stream<String> stringStream = stream1.flatMap(strings1 -> Arrays.stream(strings1));
可见, flapMap
的转换函数虽然也是生成了一个 Stream<String>
,但是它内部会将这些流进行 扁平化
,最终返回的是 Stream<String>
,
而不是 Stream<Stream<String>>
。
本文首次发布于ElseF’s Blog, 作者 @stuartlau , 转载请保留原文链接.
Previous
Stream和BaseStream