暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java8学习:Stream的flatMap()

RafeNote 2021-09-07
5030

根据Java8学习:初探Stream中,我们知道Stream是Java8中配合lambda表达式、函数式接口所使用的新功能,主要是为了更好、更方便的操作集合。Stream本身也提供了许多非常有用的方法,比如map(),接受一个Function类型的参数,所达到的效果是将一个元素映射为另一个元素,比如filter(),接受一个Predicate类型的参数,用来找出我们需要的元素。


(注:很多API我不会一一进行说明,看看文档说明,看看源码,基本都能理解,只挑选有趣的进行说明,因此,这里以flatMap()为例,教你看源码)


flatMap()就是Stream里面一个有趣的方法,它是对集合进行平展操作的。


源码长这个样子:

     <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

    文档长这个样子:

    说明文档里描述了:这个方法会返回一个流,该流包含了将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果。每个被映射的流在它的内容被放入这个流之后被关闭。


    为什么有的时候看不懂Java文档,就是因为英文翻译过来读起来不通顺,你把那个翻译过来的中文捋半天都捋不顺,但是如果你用看英文的方式去看这个文档就很清楚,我一句一句翻译给你看:


    Returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream produced by applying the provided mapping function to each element. Each mapped stream is closed after its contents have been placed into this stream. (If a mapped stream is null an empty stream is used, instead.)


    返回一个流,一个包含了结果的流,什么样的结果呢?将这个流的每个元素都替换了的结果,那用什么替换的?with有伴随的意思,所以with后就是使用了什么替换,是用一个映射流的内容替换的,那怎么替换的呢?by是通过什么了手段,通过把提供的映射函数应用给每一个元素替换的。每个被映射的流在它的内容被放入这个流之后被关闭。(如果映射的流为null,则使用空流。)


    通过做英语阅读的办法把语义拆出来,顺便说一下,我们读英语不适一部分原因就是因为英语的定语是后置的,而中文的定语是前置的,就很烦。

    然后再看文档里的apiNote:


    The flatMap() operation has the effect of applying a one-to-many transformation to the elements of the stream, and then flattening the resulting elements into a new stream.


    flatMap()操作的效果是对流的元素应用一对多的转换,然后将产生的元素展平到一个新的流中。


    现在这个flatMap()大概做了什么我们知道了,再具体就要结合源码和例子了,我们可以看到flatMap()的参数是一个泛型的Function,Function是接收一个参数,返回一个结果,也就是说会把流里面的东西映射为另一个结果。而它的返回值是一个Stream。怎么样才能返回一个Stream呢?是不是集合?Stream是不是就是用来方便操作集合的?而只有把集合变成了Stream才会方便的操作集合。那Stream是不是就是集合变过来的?


    答案呼之欲出:flatMap()就是用Function把多个集合转为一个流


    多个集合转为一个流意味着我们把多个集合打平了,他们不再是孤立的集合,而是共同构成了一个流,我们可以对这个构成的流进行操作,最后转为一个集合。


    用一个例子说明:


    假设,有一个Stream,里面三个元素,每个元素是一个arrayList,将所有的arrayList里的元素平方。

      public static void main(String[] args) {
      Stream<List<Integer>> stream = Stream.of(Arrays.asList(1), Arrays.asList(2, 3), Arrays.asList(4, 5, 6));
      stream.flatMap(theList -> theList.stream())//将每一个List转为 stream
      .map(item -> item * item)//将元素进行平方
      .forEach(System.out::println);//整体的stream输出
      }

      执行结果:1,4,9,16,25,36,

      文章转载自RafeNote,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论