java流式编程 Collector接口

news/2024/10/25 18:31:35/

目录

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


一、接口定义

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。


http://www.ppmy.cn/news/117862.html

相关文章

jar包和war包的区别;项目打包成jar或者war且运行在Linux上的tomcat

jar包和war包的区别&#xff1a; war包&#xff1a;通常是web应用后&#xff0c;例如网站&#xff0c;打成包部署到容器(可以是tomcat)中。含有包括WEB-INF包。war包通常就是放在tomcat包的/webapps下然后自动编译和运行。 jar包&#xff1a;通常是开发时要引用的类&#xff…

WebGoat8 M17 Insecure Login

这题只是想让我们意识到登录时数据传输安全的重要性&#xff0c;比方说在这道题中的数据能被我们轻易嗅探到就是一个典型的反例。 点击Login就会发送一个数据包&#xff0c;我们用Burp抓包直接拿到答案&#xff1a; 答案直接输入过关。 用户名: CaptainJack 密码&#xff1a;…

呕心沥血踩坑之:外星人M17电脑在一块硬盘上成功安装Windows与Ubuntu16.04双系统

呕心沥血踩坑之&#xff1a;外星人电脑在一块硬盘上成功安装Windows与Ubuntu16.04双系统 一、Windows下的磁盘空间处理 首先在Windows点击此电脑&#xff0c;右键点击“管理”&#xff0c;找到“磁盘管理”&#xff0c;找到想要开辟的空间&#xff0c;&#xff08;注意&#x…

RE06M17W2V1XW派克电磁比例溢流阀放大器

特点 由比例电磁铁直接控制&#xff0c;配套比例放大器驱动 最低调整压力Pmin非常低 两个压力进口:A和P 板式安装,安装界面符合ISO6264 4个压力级

WebGoat8 M17 Authentication Bypasses

Authentication Bypasses 把两个问题的参数名里的数字改一下&#xff0c;随便改参数名不行 看了一下源码&#xff0c;是因为源代码里有个判定&#xff1a; 如果参数名包含"secQuestion"&#xff0c;则将参数名作为userAnswers的key&#xff0c;参数值作为value存入…

戴尔外星人笔记本电脑Alienware m17 R4原装出厂windows10系统恢复原厂OEM系统

戴尔外星人笔记本电脑Alienware m17 R4原装出厂windows10系统恢复原厂OEM系统 系统自带所有驱动、办公软件、外星人控制中心等预装软件 链接&#xff1a;https://pan.baidu.com/s/1JprbO8IjXFBBqFRxvljT9Q?pwdszxh 提取码&#xff1a;szxh

达人评测 外星人M17R4和M15 R5锐龙版选哪个好

外星人M15 R5 锐龙版搭配的是15.6英寸&#xff0c;16:9显示比例&#xff0c;165Hz刷新率&#xff0c;100%sRGB色域&#xff0c;300nits亮度&#xff0c;3ms响应时间。选外星人M17R4还是M15 R5锐龙版这些点很重要看过你就懂了http://www.adiannao.cn/dy 外星人M17 R4搭配的是17…

Dell戴尔外星人笔记本Alienware m17 R4原装出厂Windows10系统英文版恢复原厂OEM系统

Dell戴尔外星人笔记本Alienware m17 R4原装出厂Windows10系统英文版恢复原厂OEM系统 注&#xff1a;是英文版 Alienware m17 R4中文版请点击 系统自带所有驱动、办公软件、外星人控制中心等预装软件 链接&#xff1a;https://pan.baidu.com/s/1OqRUlZ9_Ib2uJ2OKxttbTw?pwd…