转载

Stream中map和flatMap差异分析

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 为返回流中的元素 RflatMap 为一个继承了 Stream<? extends R> 类型,即它是一个 Stream
  • 也就是说, mapFunction 返回的 R 会原封不动的放入流中,不管它是什么类型;而 flatMapFunction 返回的 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

原文  https://elsef.com/2019/09/21/Stream之map和flatMap/
正文到此结束
Loading...