目录

  • 一、接口定义
  • 二、接口泛型

一、接口定义

public interface Collector<T, A, R> {Supplier<A> supplier();BiConsumer<A, T> accumulator();BinaryOperator<A> combiner();Function<A, R> finisher();Set<Characteristics> characteristics();......省略}

二、接口泛型<T, A, R>

T : 要处理的元素的类型

A : 累加器的类型

R : 返回结果的类型

三、接口方法

以 Collectors.toList() 为例

public static <T>Collector<T, ?, List<T>> toList() {return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,(left, right) -> { left.addAll(right); return left; },CH_ID);}

(1)supplier方法:ArrayList::new,提供了一个ArrayList的累加器A;

A a1 = supplier.get();

(2)accumulator():List::add,将传去的元素T添加到累加器A中,
它接受两个参数,第一个是累加器list,第二个是遍历到的流中的第n个元素;

accumulator.accept(a1, t1);

(3)combiner():(left, right) -> { left.addAll(right); return left; } ,用于并行流执行时合并两个累加器list到一个累加器list中;

A a3 = combiner.apply(a1, a2)

(4)finisher():用于完成时,将累加器的结果A转换成想要的结果R,不需要转换时可以使用 t -> t;表达式表示;

R r1 = finisher.apply(a3);

(5)characteristics(),它会返回一个不可变的Characteristics集合,用于定义
了收集器的行为;

Set<Collector.Characteristics> characteristics = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));

(6)创建累加器和结果类型一样的Collector

public static<T, R> Collector<T, R, R> of(Supplier<R> supplier,BiConsumer<R, T> accumulator,BinaryOperator<R> combiner,Characteristics... characteristics) {

(7)创建包含全部收集过程的Collector

public static<T, A, R> Collector<T, A, R> of(Supplier<A> supplier,BiConsumer<A, T> accumulator,BinaryOperator<A> combiner,Function<A, R> finisher,Characteristics... characteristics) {

(8) 枚举 Characteristics

Characteristics包含三种类型:

1、UNORDERED:归约结果不受流中项目的遍历和累积顺序的影响,即流归约结果是无序的,可以并行执行归约。

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

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

四、接口实现类

CollectorImpl实现了Collector接口,里面仅仅定义了5个函数的实例,接收实例的构造方法以及各个函数的get方法。

 static class CollectorImpl<T, A, R> implements Collector<T, A, R> {private final Supplier<A> supplier;private final BiConsumer<A, T> accumulator;private final BinaryOperator<A> combiner;private final Function<A, R> finisher;private final Set<Characteristics> characteristics;CollectorImpl(Supplier<A> supplier,BiConsumer<A, T> accumulator,BinaryOperator<A> combiner,Function<A,R> finisher,Set<Characteristics> characteristics) {this.supplier = supplier;this.accumulator = accumulator;this.combiner = combiner;this.finisher = finisher;this.characteristics = characteristics;}CollectorImpl(Supplier<A> supplier,BiConsumer<A, T> accumulator,BinaryOperator<A> combiner,Set<Characteristics> characteristics) {this(supplier, accumulator, combiner, castingIdentity(), characteristics);}@Overridepublic BiConsumer<A, T> accumulator() {return accumulator;}@Overridepublic Supplier<A> supplier() {return supplier;}@Overridepublic BinaryOperator<A> combiner() {return combiner;}@Overridepublic Function<A, R> finisher() {return finisher;}@Overridepublic Set<Characteristics> characteristics() {return characteristics;}}

总结

要想更好的理解流式编程,学习Collertor接口是必不可少的,不仅要学习jdk中已经实现了的Collertor,更要学会定义适合自己业务的Collertor。

java流式编程(六)Collector接口相关推荐

  1. Java 流式编程stream

    目录 什么是Stream? 怎么创建Stream? Stream的中间操作 Stream的终端操作 什么是Stream? Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操 ...

  2. Java流式编程stream

    文章目录 一.简介 二.创建Stream 三.常用操作 四.其他操作 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通, ...

  3. Java流式编程详解

    文章目录 1. 一个流的使用例子 2. 流简介 3. 流的特点 4. 流基本操作 4.1 中间操作 4.2 终端操作 5. 筛选和切片 5.1 用谓词筛选 5.2 筛选各异的元素 5.3 截短流 5. ...

  4. 【计算机网络 15】简单几行Java代码实现迅雷功能,java流式编程原理

    public static void main(String[] args) throws Exception { //1.创建一个socket连接 Socket socket = new Socke ...

  5. java流式编程(七)Collectors中的常用方法

    目录 前言 一.创建实体类 二.测试数据 二.测试方法 1.toCollection(collectionFactory) 2.toList() 3.toSet() 4.toMap(keyMapper ...

  6. java中Lambda+流式编程讲解(心得篇)

    首先举一个例子来说明,我们要在一群人里面刷选一些,首先自己写一个Person类: package 任务十三__流式计算.公司;import java.util.Objects;/*** @author ...

  7. Java Stream流式编程

    流式编程Stream 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通,在节点被处理. 流[无存储],流不是一种数据结构 ...

  8. java流式接口,JAVA流式计算

    JAVA流式计算 流的简单介绍 Java 8 中,引入了流(Stream)的概念,利用提供的Stream API,我们可以方便的操作集合数据,这种方式很类似于使用SQL对数据库的操作. 如何生成流 利 ...

  9. java 流式_Java核心教程5: 流式编程

    本次课程的标题不像之前那样易懂,是一个陌生的概念,"流式编程"是个什么东西? 在了解流式编程之前先思考一下"流",水流.电流.人流,这些都是流.而流式编程则是让 ...

最新文章

  1. 谈谈Activity如何启动的
  2. 联想笔记本电脑的F1至F12键盘问题。怎么设置才能不按FN就使用F1
  3. isnull pivot server sql_SQLServer行列转换 Pivot UnPivot
  4. 用Maven插件生成Mybatis代码/数据库
  5. 波形捕捉:(7)“捕捉缓冲区”特效
  6. [国家集训队]最长双回文串 manacher
  7. 控制html页面在浏览器显示比例,判断浏览器缩放比例的方法_html/css_WEB-ITnose
  8. 81. 搜索旋转排序数组 II---Leecode----java
  9. es 时间字段聚合_ES之五:ElasticSearch聚合
  10. Python 代码风格指南谷歌版
  11. 大龄技术人的出路在哪里?6月20日长沙-中国技术开放日邀请你一起探讨
  12. 华为-2025十大趋势:智能世界,触手可及.pdf(附下载链接)
  13. (进阶)LeetCode(766)——托普利茨矩阵(JavaScript)
  14. 小米电视4A核心技术之语音识别浅析
  15. c 调用java map_如何从C中的map迭代器调用类成员函数?
  16. 如何利用线程堆栈定位问题
  17. 利用Drawable绘制圆角图片和圆形图片
  18. 国内知名插画培训机构有哪些
  19. 10.1寸安卓通用车载导航
  20. RabbitMq安装(Erlang前置安装)

热门文章

  1. 【C++】类的6个默认成员函数详解
  2. python判断成年_用python判断你是青少年还是老年人
  3. python第三方插件登录网易音乐_项目实战 | Python开发网易云音乐插件
  4. 从SQLserver中导出表数据到Access
  5. 【漫漫转码路】Day 39 C++ day10
  6. 麦德龙中国正式引进高品质法国牛肉
  7. maven打包之胖包与瘦包
  8. android x86 修改器,烧饼修改器x86专属版
  9. php免费短信接,PHP实现飞信接口来通过网页免费发短信
  10. c语言微信小程序编程,微信小程序实现类似微信点击语音播放效果