c++中的new_怎么在java中创建一个自定义的collector

简介

在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类。

今天我们介绍一下怎么自定义一个Collector。

Collector介绍

我们先看一下Collector的定义:

511aeb3199eab66cd5cdbb5dbdad2dae.png

Collector接口需要实现supplier(),accumulator(),combiner(),finisher(),characteristics()这5个接口。

同时Collector也提供了两个静态of方法来方便我们创建一个Collector实例。

我们可以看到两个方法的参数跟Collector接口需要实现的接口是一一对应的。

下面分别解释一下这几个参数:

  • supplier

Supplier是一个函数,用来创建一个新的可变的集合。换句话说Supplier用来创建一个初始的集合。accumulator

  • accumulator

accumulator定义了累加器,用来将原始添加到集合中。

  • combiner

combiner用来将两个集合合并成一个。

  • finisher

finisher将集合转换为最终的集合类型。

  • characteristics

characteristics表示该集合的特征。这个不是必须的参数。

有了这几个参数,我们接下来看看怎么使用这些参数来构造一个自定义Collector。

自定义Collector

我们利用Collector的of方法来创建一个不变的Set:

public static <T> Collector<T, Set<T>, Set<T>> toImmutableSet() {return Collector.of(HashSet::new, Set::add,(left, right) -> {left.addAll(right);return left;}, Collections::unmodifiableSet);}

上面的例子中,我们HashSet::new作为supplier,Set::add作为accumulator,自定义了一个方法作为combiner,最后使用Collections::unmodifiableSet将集合转换成不可变集合。

上面我们固定使用HashSet::new作为初始集合的生成方法,实际上,上面的方法可以更加通用:

public static <T, A extends Set<T>> Collector<T, A, Set<T>> toImmutableSet(Supplier<A> supplier) {return Collector.of(supplier,Set::add, (left, right) -> {left.addAll(right);return left;}, Collections::unmodifiableSet);}

上面的方法,我们将supplier提出来作为一个参数,由外部来定义。

看下上面两个方法的测试:

@Testpublic void toImmutableSetUsage(){Set<String> stringSet1=Stream.of("a","b","c","d").collect(ImmutableSetCollector.toImmutableSet());log.info("{}",stringSet1);Set<String> stringSet2=Stream.of("a","b","c","d").collect(ImmutableSetCollector.toImmutableSet(LinkedHashSet::new));log.info("{}",stringSet2);}

输出:

INFO com.flydean.ImmutableSetCollector - [a, b, c, d]
INFO com.flydean.ImmutableSetCollector - [a, b, c, d]

总结

本文介绍了Collector和自定义Collector的实例,希望能对大家有所帮助。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/customCollector

欢迎关注我的公众号:程序那些事,更多精彩等着您!更多内容请访问
怎么在java中创建一个自定义的collector​www.flydean.com
29b255e9dec71b5bc0a5f575a4bc69bb.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 9中的新Regex功能

最近&#xff0c;我收到了Packt出版的Anubhava Srivastava提供的免费书籍“ Java 9 Regular Expressions” 。 这本书是一个很好的教程&#xff0c;它向任何想学习正则表达式并从头开始的人介绍。 那些知道如何使用正则表达式的人可能仍然很有趣&#xff0c;以重申其知识并加深…

c语言实现二分法_C语言实现二分法求解方程在区间内的根

C语言实现二分法求解方程在区间内的根。设有非线性方程&#xff1a;其中&#xff0c; 为 上连续函数且设 (不妨设方程在 内仅有一个实根)&#xff0c;求上述方程实根的二分法过程&#xff0c;就是将含根区间[a,b]逐步分半&#xff0c;检查函数值符号的变化&#xff0c;以便确定…

计划

赤 wqs二分 https://www.cnblogs.com/Juve/p/11479423.html https://www.cnblogs.com/Rorschach-XR/p/11479602.html 反悔贪心 https://www.cnblogs.com/cjyyb/p/9367948.html https://www.cnblogs.com/Miracevin/p/9795871.html https://blog.csdn.net/weixin_34344677/articl…

java写入文件编码格式为ansi_Windows10 bat批处理删除 快速打开文件夹 固定到开始菜单或任务栏...

1. 快速打开文件夹1.1 bat文件如果你经常打开一个被放在很深的文件夹&#xff0c;于是浪费很多打开文件的时间&#xff1a;开始>此电脑>Data(D:)>文件夹1>文件夹2...>文件夹n>平均要浪费大约10秒的时间&#xff0c;如果每天打开100次&#xff0c;那么1000秒&…

python中__init__.py的作用、module和package

控制包的导入行为&#xff1a; 1、声明当前文件是一个可导入的包&#xff1b;2、如果当下包下有多个.py文件使用__ all__ [ 模块名]&#xff0c;也就是form XXX import YYYmodule和package 为了编写可维护的代码&#xff0c;我们把很多函数分组&#xff0c;分别放到不同的文件…

java default修饰符_Java基础语法二

Java循环结构for循环/* for(初始化;布尔表达式;更新) {执行代码 } */ for(int i0; i < 5; i) {System.out.println(i); }最先执行初始化步骤&#xff1b;可以声明一种类型&#xff0c;但可初始化一个或多个循环控制变量&#xff0c;也可以是空语句然后检测布尔表达式&#x…

微信开发修改button里的字体大小_微信小程序全栈开发课程【视频版】2.2 index页面完善...

​点击观看视频课程 ↓↓↓微信小程序首页完善https://www.zhihu.com/video/1195308096099282944课程文字版1、template 部分&#xff08;1&#xff09;修改template部分的代码template里面包含html代码&#xff0c;对应着原生小程序框架里中的.wxml文件。我们将index.vue文件中…

jaxb list集合对象_JAXB –表示空集合和空集合

jaxb list集合对象示范代码 以下演示代码将用于Java模型的所有不同版本。 它只是将一个集合设置为null&#xff0c;第二个设置为空列表&#xff0c;第三个设置为填充列表。 package package blog.xmlelementwrapper;import java.util.ArrayList; import javax.xml.bind.*;publ…

.net 把一个对象赋值给一个参数_Java GC回收算法-判定一个对象是否可以回收

开源推荐推荐一款一站式性能监控工具&#xff08;开源项目&#xff09;Pepper-Metrics是跟一位同事一起开发的开源组件&#xff0c;主要功能是通过比较轻量的方式与常用开源组件&#xff08;jedis/mybatis/motan/dubbo/servlet&#xff09;集成&#xff0c;收集并计算metrics&a…

管理角色认知-新晋管理常常犯的错

背景 管理是一门实践科学&#xff0c;从知道到做到&#xff0c;需要长时间的刻意练习&#xff0c;提前知道那些坑&#xff0c;可以提前规避。 坑1&#xff1a;被动执行 现象&#xff1a; 不主动找活干&#xff0c;等上级派活&#xff1b; 上级有了安排&#xff0c;指望上级替他…

头条号个人中心登录_登陆自己的头条号后台操作步骤

作为一个自媒体新人对自媒体的知识还是不够了解的&#xff0c;有的新人甚至还不知道什么是头条号后台&#xff0c;这篇文章是专为新手写的一篇文章&#xff0c;带你走进你的头条号后台遛一圈。那么什么是头条号后台呢&#xff1f;这里笔者就作下简单的介绍方便新人学习。登陆自…

python保存变量_将python 中的变量保存到本地

如何将python中的变量保存在本地&#xff1f; 将python 的一些代码保存在本地&#xff0c; 特别是一些需要大量运算的结果&#xff0c;例如 机器学习里面的模型&#xff0c;&#xff0c;放在本地&#xff0c;还是比较好用的。下次就可以直接拿出来使用就好。 其实可以 我觉得可…

django filter查询多选_Django:使用filter的pk进行多值查询操作

由于想要做收藏夹的功能&#xff0c;所以希望能够一次性查询出所有id的对象&#xff0c;查看文档&#xff0c;找到了如下方法pk是primary key的缩写&#xff0c;顾名思义pk_in就是primary key在某一个范围内&#xff0c;具体操作(以自带的User为例)&#xff1a;User.objects.fi…

csp-c模拟测试「set·read·」

set 题解 只要求一组特解 像入阵曲一样就好了(入阵曲真是好题啊$!$) $(sum[r]-sum[l])\%n0$ 拆成$sum[r]\%nsum[l]\%n$桶里存$sum[l]\%n$每次找$sum[r]$桶里有没有对应的#sum[l]# 存$tong[0]1$,别的先查后存 证明 证明一下正确性 $0$自己合法$(sum[r]\%n)0$不需要找对应 其他都…

JSP,JSF和EL简介

JavaServer页面&#xff0c;JavaServer Faces和表达语言 在本文中&#xff0c;我将研究JavaServer Pages&#xff08;JSP&#xff09;和Expression Language&#xff08;EL&#xff09;&#xff0c;然后将其与JavaServer Faces &#xff08;JSF&#xff09;关联。 我将讨论如何…

stream模式不能接受blob文件_一文带你层层解锁文件下载的奥秘

今天带来的主题是关于文件下载&#xff0c;通过本文带你领略文件下载的奥秘。本文会花费你较长的时间阅读&#xff0c;建议先收藏/点赞&#xff0c;然后查看你感兴趣的部分&#xff0c;平时也可以充当当做字典的效果来查询。:) 不整不知道&#xff0c;一整&#xff0c;居然整出…

# 管道已结束_县城这条路启用自来水新管道,看看是否在你家附近...

连日来&#xff0c;县自来水公司的工作人员顶着高温抓紧作业&#xff0c;目前&#xff0c;县城范堤路自来水管道改造工程已过半&#xff0c;预计本月中旬完工。施工现场1目前&#xff0c;盐垣路至掘中路的新管道正在进行对接&#xff0c;为了确保启用新管道后的用水安全&#x…

python 中的eval与exec

eval类似exec,是使用python编译器运行表达式和语句两者区别在于:eval是编译表达式并返回值(如: eval("hello*2") 结果是 hellohello)exec则是运行一部分代码,并且不像eval那样返回结果,exec的返回值永远是None,且exec可运行多行代码(如: exec("l[1,2,3]\nfor i …

启动时指定需要绑定的网卡_为什么小型汽油机在启动时需要拉风门,而汽车却不用?...

很多人都有骑小型摩托车的经验&#xff0c;在启动摩托车时&#xff0c;一般要把“合风”拉上&#xff0c;否则摩托车启动就会很困难。特别是在天气比较寒冷时&#xff0c;如果不拉上合风&#xff0c;摩托车很难启动。但是在汽车上却没有“合风”这个装置&#xff0c;我们在启动…

java 栈和队列实现迷宫代码_Python 实现数据结构中的的栈,队列

栈栈(stack)又名堆栈&#xff0c;它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶&#xff0c;相对地&#xff0c;把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈&#xff0c;它是把新元素放到栈顶元素的上面&#xff…