Java Streams详解

2023-12-14 00:23:54

? 这里的Stream不是输入输出流,而是Java 8对Collection的一个增强,专注于对集合对象便利又高效的聚合操作,支持串行操作功能,还能借助Fork/Join机制支持并行模式,在多核CPU的环境下,最大程度的来利用CPU超快计算能力。

1、Stream介绍及其基本操作

? ? ? Stream为容器的使用提供了新的方式,允许通过陈述式编码风格对容器中的数据进行分组、过滤、计算、排序、聚合、循环等操作。Stream是支持顺序或者并行操作的元素序列。Stream具有如下特点:不存储数据;不是数据结构;不会改变原来的数据结构;可以是无限元素的集合;支持lazy操作;每一个intermediate操作都会以lazy的方式执行,并且返回一个新的Stream;Terminal操作将会结束Stream,并且返回最终结果;无法被重用,对Stream的每一次操作都会产生一个全新的Stream;支持函数式编程。

? ? ?创建Stream的方式有:

  • 利用Stream接口提供的静态方法of获取一个Stream

  • 通过Stream.Builder创建Stream

  • 利用Stream的empty方法创建空Stream

  • 通过Functions创建无限元素的Stream

  • 通过NumericStream创建无限元素的Stream

  • 通过NumericStream创建有限元素的Stream

  • 通过数组创建Stream

  • 通过集合容器创建Stream

  • 通过Map容器创建Stream

  • 通过File创建Stream

  • 通过其他方式创建Stream

? ? Stream的操作分为两大类型,分别是intermediate和terminal。intermediate操作的结果都会产生一个全新的Stream类型,并且都是以lazy方式执行。多个intermediate操作可以构成一个流水线(pipeline),直到遇到最后的terminal操作。intermediate操作有:distinct、filter、limit、map、skip、peek、sorted、flatMap。terminal操作会终结Stream流水线的继续执行,并返回一个非Stream类型的结果。在一个Stream流水线中,执行了terminal方法之后,Stream将被关闭。terminal操作有:match、find、foreach、count、max、min、collect、reduce。

? ? ? NumericStream代表着具体数据类型的Stream,如IntStream、DoubleStream、LongStream。这种类型出现是因为int在操作上要比Integer类型的少一次拆箱操作。

? ? ? ?默认情况下,我们创建的Stream都是串行的,转换为并行方式可以借助parallel()方法。

2、Collector在Stream中的使用

? ? ?Collector在Stream中主要的用途大致分三项:1、Reduce和Summarizing Stream的元素到一个单一的新输出中;2、对Stream中的元素进行分组;3、对Stream中的元素进行分区。

? ? ? Collectors可以看作是Collector的工厂类。Collectors常用的方法如下:

? ? ? Collectors.averaging类型方法,将Stream的元素转换为具体数据类型,然后计算平均值。

? ? ? Collectors.collectingAndThen方法,对当前Stream元素经过一次Collector操作后再进行transformation操作,如汇总打折。

? ? ? Collectors.counting方法,返回Stream中的元素个数。

? ? ? Collectors.mapping方法,首先function将Stream中类型为T的元素转换为U类型,接着downstream collector将处理元素类型为U的Stream。

? ? ? Collectors.joining方法,将Stream中的元素连接成字符串返回,可添加前缀和后缀。

? ? ? Collectors.summing方法,将Stream中的元素转换成数字类型,然后对所有值求和。

? ? ? Collectors.maxBy和Collectors.minBy方法,根据比较器获取Stream中的最大值和最小值

? ? ? Collectors.summarizing方法,将Stream中的元素转换为数字类型,并进行汇总运算,返回数字类型的SummaryStatistics类型。

? ? ? Collectors输出元素到其他容器的方法有:toSet、toLsit、toMap、其他容器等。

? ? ? Coolectors.partitioningBy方法,根据判断条件将Stream中的元素分为两个部分

? ? ? Collectors.groupingBy方法,根据分类器对Stream中的元素进行分组。

? ? ? Collectors.reducing方法,对Stream中的元素做reduce计算。

3、Parallel Stream(并行流)详解?

? ? ? 并行流在计算时,需要清晰地了解元素和元素类型,同时也要关注计算本身是否高效。并行流在做数值计算时,优先采用数值类型的流;非数值型的流要考虑操作的元素类型是否有利于计算。并行流底层的线程数与CPU核数有相同数量的线程。除了这种默认的情况,还可以使用parallel(int n)指定线程数量。

System.setProperty("java.util.concurrent.ForkJoinPool.commom.parallelism","16");

?Spliterator主要用于Stream中,特别是并行流进行元素块拆分时。? 也可以自定义Spliterator。?

List<String> list=new ArrayList<>();
Spliterator<String> sp=list.spliterator();
System.out.println(sp.characteristics());
System.out.println(sp.ORDERED|sp.SIZED|sp.SUBSIZED);

//输出
16464
16464

文章来源:https://blog.csdn.net/seacean2000/article/details/134947113
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。