java流式编程(六)Collector接口
目录
- 一、接口定义
- 二、接口泛型
一、接口定义
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接口相关推荐
- Java 流式编程stream
目录 什么是Stream? 怎么创建Stream? Stream的中间操作 Stream的终端操作 什么是Stream? Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操 ...
- Java流式编程stream
文章目录 一.简介 二.创建Stream 三.常用操作 四.其他操作 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通, ...
- Java流式编程详解
文章目录 1. 一个流的使用例子 2. 流简介 3. 流的特点 4. 流基本操作 4.1 中间操作 4.2 终端操作 5. 筛选和切片 5.1 用谓词筛选 5.2 筛选各异的元素 5.3 截短流 5. ...
- 【计算机网络 15】简单几行Java代码实现迅雷功能,java流式编程原理
public static void main(String[] args) throws Exception { //1.创建一个socket连接 Socket socket = new Socke ...
- java流式编程(七)Collectors中的常用方法
目录 前言 一.创建实体类 二.测试数据 二.测试方法 1.toCollection(collectionFactory) 2.toList() 3.toSet() 4.toMap(keyMapper ...
- java中Lambda+流式编程讲解(心得篇)
首先举一个例子来说明,我们要在一群人里面刷选一些,首先自己写一个Person类: package 任务十三__流式计算.公司;import java.util.Objects;/*** @author ...
- Java Stream流式编程
流式编程Stream 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通,在节点被处理. 流[无存储],流不是一种数据结构 ...
- java流式接口,JAVA流式计算
JAVA流式计算 流的简单介绍 Java 8 中,引入了流(Stream)的概念,利用提供的Stream API,我们可以方便的操作集合数据,这种方式很类似于使用SQL对数据库的操作. 如何生成流 利 ...
- java 流式_Java核心教程5: 流式编程
本次课程的标题不像之前那样易懂,是一个陌生的概念,"流式编程"是个什么东西? 在了解流式编程之前先思考一下"流",水流.电流.人流,这些都是流.而流式编程则是让 ...
最新文章
- 谈谈Activity如何启动的
- 联想笔记本电脑的F1至F12键盘问题。怎么设置才能不按FN就使用F1
- isnull pivot server sql_SQLServer行列转换 Pivot UnPivot
- 用Maven插件生成Mybatis代码/数据库
- 波形捕捉:(7)“捕捉缓冲区”特效
- [国家集训队]最长双回文串 manacher
- 控制html页面在浏览器显示比例,判断浏览器缩放比例的方法_html/css_WEB-ITnose
- 81. 搜索旋转排序数组 II---Leecode----java
- es 时间字段聚合_ES之五:ElasticSearch聚合
- Python 代码风格指南谷歌版
- 大龄技术人的出路在哪里?6月20日长沙-中国技术开放日邀请你一起探讨
- 华为-2025十大趋势:智能世界,触手可及.pdf(附下载链接)
- (进阶)LeetCode(766)——托普利茨矩阵(JavaScript)
- 小米电视4A核心技术之语音识别浅析
- c 调用java map_如何从C中的map迭代器调用类成员函数?
- 如何利用线程堆栈定位问题
- 利用Drawable绘制圆角图片和圆形图片
- 国内知名插画培训机构有哪些
- 10.1寸安卓通用车载导航
- RabbitMq安装(Erlang前置安装)
热门文章
- 【C++】类的6个默认成员函数详解
- python判断成年_用python判断你是青少年还是老年人
- python第三方插件登录网易音乐_项目实战 | Python开发网易云音乐插件
- 从SQLserver中导出表数据到Access
- 【漫漫转码路】Day 39 C++ day10
- 麦德龙中国正式引进高品质法国牛肉
- maven打包之胖包与瘦包
- android x86 修改器,烧饼修改器x86专属版
- php免费短信接,PHP实现飞信接口来通过网页免费发短信
- c语言微信小程序编程,微信小程序实现类似微信点击语音播放效果