首页 > 编程语言 >Dating Java8系列之用流收集数据

Dating Java8系列之用流收集数据

时间:2024-01-12 23:46:18浏览次数:25  
标签:容器 收集器 结果 之用 累加器 归约 Dating Collector Java8

给我馍馍/文

 

图片

 

图片

收集器简介

 

1.收集器介绍

Java 8中流支持两种类型的操作:中间操作(如filter或map)和终端操作(如count、findFirst、forEach和reduce)。

中间操作可以链接起来,将一个流转换为另一个流。这些操作不会消耗流,其目的是建立一个流水线。与此相反,终端操作会消耗流,以产生一个最终结果,例如返回流中的最大元素。

 

2.概念辨析

collect:Stream接口中定义的方法用来整合收集流操作的最终结果,其中的一个接口定义为。

<R, A> R collect(Collector<? super T, A, R> collector);

Collector:Collector是专门用来作为Stream的collect方法的参数的,Collector主要包含五个参数,它的行为也是由这五个参数来定义的。

public interface Collector<T, A, R> {// supplier参数用于生成结果容器,容器类型为ASupplier<A> supplier();// accumulator用于消费元素,也就是归纳元素,这里的T就是元素,它会将流中的元素一个一个与结果容器A发生操作BiConsumer<A, T> accumulator();// combiner用于两个两个合并并行执行的线程的执行结果,将其合并为一个最终结果ABinaryOperator<A> combiner();// finisher用于将之前整合完的结果R转换成为AFunction<A, R> finisher();// characteristics表示当前Collector的特征值,这是个不可变SetSet<Characteristics> characteristics();}

Collectors:Collectors是一个工具类,是JDK预实现Collector的工具类,它内部提供了多种Collector,我们可以直接拿来使用。

Collection:Collection接口是 (java.util.Collection)是Java集合类的顶级接口之一,整个集合框架就围绕一组标准接口而设计。 

 

图片

使用Collector进行collect收集

 

Collector接口中的方法介绍

1. 建立新的结果容器:supplier方法

supplier方法必须返回一个结果为空的Supplier,也就是一个无参数函数,在调用时它会创建一个空的累加器实例,供数据收集过程使用。

 

2. 将元素添加到结果容器:accumulator方法 

accumulator方法会返回执行操作的函数。当遍历到流中第n个元素时,这个函数执行时会有两个参数保存归约结果的累加器(已收集了流中的前n-1个项目),还有第n个元素本身。

 

3.对结果容器应用最终转换finisher

在遍历完流后,finisher方法必须返回在累积过程的,最后要调用的一个函数,以便将累加器对象转换为整个集合操作的最终结果。

 

4.合并两个结果容器:combiner方法

四个方法中的最后一个——combiner方法会返回一个供归约操作使用的函数,它定义了对流的各个子部分进行并行处理时,各个子部分归约所得的累加器要如何合并。

 

5.characteristics方法

  • Characteristics是一个包含三个项目的枚举。

  • UNORDERED——  结果不受流中项目的遍历和累积顺序的影响。

  • CONCURRENT—— accumulator函数可以从多个线程同时调用,且该收集器可以并行归约流。如果收集器没有标为UNORDERED,那它仅在用于无序数据源时才可以并行归约。

  • IDENTITY_FINISH——这表明完成器方法返回的函数是一个恒等函数,可以跳过。这种情况下,累加器对象将会直接用作归约过程的最终结果。这也意味着,将累加器A不加检查地转换为结果R是安全的。

 

示例

 

1.顺序归约过程的逻辑步骤

1. 建立新的结果容器:supplier方法

2. 将元素添加到结果容器:accumulator方法 

3. 对结果容器应用最终转换:finisher

图片

 

2.使用combiner来并行化归约过程

 

图片

 

图片

Collectors类

 

图片

图片

 

图片

小结

 

  • collect是一个终端操作,它接受的参数是将流中元素累积到汇总结果的,各种方式(称为收集器)。

  • 预定义收集器包括将流元素归约和汇总到一个值,例如计算最小值、最大值或平均值。

  • 预定义收集器可以用groupingBy对流中元素进行分组,或用partitioningBy进行分区。

  • 你可以实现Collector接口中定义的方法来开发你自己的收集器。

 

作者:翎野君
博客:https://www.cnblogs.com/lingyejun/

 

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

标签:容器,收集器,结果,之用,累加器,归约,Dating,Collector,Java8
From: https://www.cnblogs.com/givemomo/p/17961798

相关文章

  • Dating Java8系列之Lambda表达式和函数式接口(下)
    给我馍馍/文  使用函数式接口  函数式接口定义且只定义了一个抽象方法。函数式接口很有用,因为抽象方法的签名可以描述Lambda表达式的签名。为了应用不同的Lambda表达式,你需要一套能够描述常见函数描述符的函数式接口。Java8的库设计师帮我们在java.util.......
  • Dating Java8系列之Lambda表达式和函数式接口(上)
    给我馍馍/文  Lambda简介 我们可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式。它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。匿名:我们说匿名,是因为它不像普通的方法那样有一个明确的名称。函数:我们说它是函数,......
  • Dating Java8系列之通过行为参数化传递代码
    给我馍馍/文 引言 作为技术开发人员,我们无法保证我们写出来的代码的可用时间和保质期,也许今天刚上线的一个功能,等到明天就因为需求变动不得不进行更改。 为什么会不断的变化作为技术人员,我们当然希望需求能循序渐进地平稳过度,但往往事与愿违,对于其原因我简单总结为以......
  • Dating Java8系列之default默认方法
    给我馍馍/文  引言 传统上,Java程序的接口是将相关方法按照约定组合到一起。实现接口的类必须为接口中定义的每个方法提供一个实现,或者从父类中继承它的实现。 不断迭代的API默认方法的引入就是为了,以兼容的方式,解决像JavaAPI这样的类库,演进迭代问题。理解演进迭......
  • Dating Java8系列之Java8中的流操作
    给我馍馍/文  本次我们会使用到很多的流操作,如筛选、切片、映射、查找、匹配和归约,这些操作可以让我们能快速完成复杂的数据查询。 筛选和切片 用谓词筛选Streams接口支持filter方法。该操作会接受一个谓词(一个返回boolean的函数)作为参数,并返回一个包括所有符合......
  • Dating Java8系列之Java8中的‘流’
    给我馍馍/文 流的概念 1.流是什么流是JavaAPI的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,我们可以把它们看成遍历数据集的高级迭代器。 代码:按价格排序后得到手机名称列表 使用新的流式方法有几个显而易见......
  • Dating Java8系列之巧用Optional之优雅规避NPE问题
    给我馍馍/文  避之不及的NullPointerException NPE:NullPointerException空指针异常是最常见的Java异常之一,抛出NPE错误不是用户操作的错误,而是开发人员的错误,应该被避免,那么只能在每个方法中加入非空检查,阅读性和维护性都比较差。以下是一个常见的嵌套对象:一个用......
  • Dating Java8系列之并行数据处理
    翎野君/文  分支合并框架 分支合并框架介绍分支/合并框架的目的是以递归的方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果。它是ExecutorService接口的一个实现,它把子任务分配给线程池(称为ForkJoinPool)中的工作线程。把任务提交......
  • java8日期时间格式化DateTimeFormatter多个格式
    原文地址:datetimeformatter.ofpatternmultipleformats-掘金DateTimeFormatter 是一个用于日期时间格式化和解析的类。使用 ofPattern 方法可以创建一个格式化器,该方法接受一个日期时间格式的字符串作为参数。如果您需要在同一个 DateTimeFormatter 对象中支持多种不同的......
  • java8中object转list
    Java8中Object转List的实现概述在Java8中,我们可以使用StreamAPI将一个Object对象转换为List集合。本文将介绍如何使用StreamAPI实现此功能,并提供相应的示例代码。实现步骤下面是实现"Java8中Object转List"的步骤,我们可以使用以下表格形式展示:步骤描述1创建一个Obj......