java stream流原理,stream流实现原理

  java stream流原理,stream流实现原理

  00-1010一、流水线作业回顾二。中间操作:有状态和无状态III。限制和跳过管道数据拦截。不同元素的重复数据删除。串行、并行和顺序。

  

目录

 

  通过前面几章的学习,我们应该了解流管道流的基本操作。让我们回顾一下:

  源码:可以将数组、集合类、行文本文件转换成流水线流进行数据处理。中间操作:流流中的数据处理,如过滤、数据转换等。终端操作:功能是将stream管道流转换成其他数据类型。这部分我们还没讲,后面再介绍。看下面的脑图会有更清晰的认识:

  00-1010其实程序员在编程中经常会接触到“有状态”和“无状态”,大多数人都是相对无知的。此外,“国家”一词的含义在不同的情况下似乎是不同的。但是,要理解“状态”这个词在编程领域的含义,笔者教你几个要点:

  状态通常代表公共数据,拥有一个状态就意味着拥有“公共数据”。因为有公共数据,国家通常需要额外的存储。状态通常是多人、多用户、多线程、多次操作的,涉及到状态管理和变更操作。不是更混乱吗?比如,你就会明白。

  开发web会话是一种状态。访问者的多个请求与同一个会话相关联,需要存储在内存或redis中。同一个公共会话被多次请求,这个会话就是状态数据。

  e的vuex的商店是一个状态。首先,它对多个组件是通用的。其次,不同的组件可以修改它。最后,它需要独立于组件存储。所以商店是一种状态。

  回到我们的溪流管道流

  使用filtermap操作,不需要关联管道流的前后元素,因此不需要记录元素之间的关系。输入一个元素以获得结果。

  Sorted是一种排序操作,distinct是一种重复数据消除操作。像这样的操作,都是和其他元素相关的,我一个人完成不了整个操作。就像班级点名是无状态的,叫你就可以回答。如果班里的学生按大小排序,那就不是你自己的事了。你要把自己的身高和周围的人比较,记住你记住的身高比较结果是一种“状态”。所以这个操作是有状态操作。

  

一、回顾Stream管道流操作

list string limitN=stream . of(猴子,狮子,长颈鹿,狐猴)。极限(2)。collect(collectors . to list());ListString skipN=Stream.of(猴子,狮子,长颈鹿,狐猴)。跳过(2)。collect(collectors . to list());limt方法传入一个整数N,用于截取管道中的前N个元素。流水线处理后的数据是:[猴子,狮子]。Skip方法与limit方法相反,用于跳过前N个元素,截取从N到末尾的元素。流水线处理后的数据是:[长颈鹿,狐猴]

 

  00-1010我们还可以使用distinct方法对管道中的元素进行重复数据删除。当涉及重复数据删除时,它必须涉及元素之间的比较。当distinct方法调用Object的equals方法比较对象时,如果有自己的比较规则,可以重写equals方法。

  ListString unique animals=stream . of(猴子,狮子,长颈鹿,狐猴,狮子)。独特()。collect(collectors . to list());以上代码去重后的结果是:[猴子,狮子,长颈鹿,狐猴]

  00-1010默认情况下,sorted按字母的自然顺序排序。下面这段代码的排序结果是:【长颈鹿,狐猴,狮子,猴子】,字数G在L前面,L在M前面依次排列。第一个和第二个难以区分。

  序,就比较第二位字母。

  

List<String> alphabeticOrder = Stream.of("Monkey", "Lion", "Giraffe", "Lemur") .sorted() .collect(Collectors.toList());

排序我们后面还会给大家详细的讲一讲,所以这里暂时只做一个了解。

 

  

 

  

六、串行、并行与顺序

通常情况下,有状态和无状态操作不需要我们去关心。除非?:你使用了并行操作。

 

  还是用班级按身高排队为例:班级有一个人负责排序,这个排序结果最后就会是正确的。那如果有2个、3个人负责按大小个排队呢?最后可能就乱套了。一个人只能保证自己排序的人的顺序,他无法保证其他人的排队顺序。

  串行的好处是可以保证顺序,但是通常情况下处理速度慢一些并行的好处是对于元素的处理速度快一些(通常情况下),但是顺序无法保证。这可能会导致进行一些有状态操作的时候,最后得到的不是你想要的结果。

 

  

Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion") .parallel() .forEach(System.out::println);

parallel()函数表示对管道中的元素进行并行处理,而不是串行处理。但是这样就有可能导致管道流中后面的元素先处理,前面的元素后处理,也就是元素的顺序无法保证。

 

  如果数据量比较小的情况下,不太能观察到,数据量大的话,就能观察到数据顺序是无法保证的。

  

MonkeyLionLemurGiraffeLion

 

  

通常情况下,parallel()能够很好的利用CPU的多核处理器,达到更好的执行效率和性能,建议使用。但是有些特殊的情况下,parallel并不适合:深入了解请看这篇文章: https://blog.oio.de/2016/01/22/parallel-stream-processing-in-java-8-performance-of-sequential-vs-parallel-stream-processing/

 

  该文章中几个观点,说明并行操作的适用场景:

  数据源易拆分:从处理性能的角度,parallel()更适合处理ArrayList,而不是LinkedList。因为ArrayList从数据结构上讲是基于数组的,可以根据索引很容易的拆分为多个。

  

 

  适用于无状态操作:每个元素的计算都不得依赖或影响任何其他元素的计算,的运算场景。基础数据源无变化:从文本文件里面边读边处理的场景,不适合parallel()并行处理。parallel()一开始就容量固定的集合,这样能够平均的拆分、同步处理。

  以上就是java理论基础Stream管道流状态与并行操作的详细内容,更多关于java Stream管道流状态与并行操作的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: