怎么在java中创建一个自定义的collector
文章目录
- 简介
- Collector介绍
- 自定义Collector
- 总结
怎么在java中创建一个自定义的collector
简介
在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类。
今天我们介绍一下怎么自定义一个Collector。
Collector介绍
我们先看一下Collector的定义:
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
更多精彩内容且看:
- 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
- Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
- Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
- java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程
欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com
怎么在java中创建一个自定义的collector相关推荐
- c++中的new_怎么在java中创建一个自定义的collector
简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类. 今 ...
- java中collector使用_怎么在java中创建一个自定义的collector
怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或 ...
- java全局变量怎么定义_怎么在java中创建一个自定义的collector
简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类. 今 ...
- 如何在Java中创建一个新的List
本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...
- html中模块怎么创建,在Joomla中创建一个自定义HTML模块,不显示
我有几个Joomla!我感到有信心的网站.我的Joomla!网站有一个artisteer模板. 我最近做了一个"戳出"的图片,突出了纸张的边缘,并展示了一个android" ...
- java创建临时文件夹_如何在Java中创建一个临时目录/文件夹?
有没有在Java应用程序内部创建临时目录的标准可靠方法? Java的问题数据库中有一个条目,注释中包含一些代码,但是我想知道在一个常用的库(Apache Commons等)中是否找到标准解决方案? # ...
- Java乐谱_如何在java中创建一个简单但结构良好的乐谱表(乐谱)?
我正在使用非常基本的声音合成在我的游戏中创建音频和效果.基本上,我有一些方法可以发出一个频率和频率的声音.幅度和幅度持续时间. 对于短语和旋律,我想提出一个基本的符号,这样我就可以轻松地重写或添加新的 ...
- 如何在K8S中创建一个自定义Controller?
目的 CRD资源定义 代码生成 Controller编写 目的 Custom Resource是扩展Kubernetes的一种方式(另外一种就是通过聚合层API apiserver-aggregati ...
- 在mysql中创建一个自定义函数来计算两个数的和_Mysql创建自定义函数
Mysql创建用户自定义函数: >显示库中所有的自定义函数信息: show function status; >创建自定义函数的过程如下demo1: drop function if ex ...
最新文章
- cf375D. Tree and Queries
- 软考网络管理员学习笔记5之第五章广域网与接入网技术
- 提高Eclipse的速度,去掉对于工程的 Validatioan
- _RecordsetPtr
- 深度学习TF—13.对抗生成网络—GAN
- DrawText如何使多行文字居中
- 把oa系统部署到云服务器,oa系统怎么部署到云服务器
- ubuntu硬盘序列号怎么查询_如何在Linux中查找硬盘的详细信息?
- 下载安装php详细教程(在安装配置apache之后)
- 学习嵌入式单片机需要学习哪些内容?
- 共享计算机怎么连,电脑如何连接共享文件
- Chrom浏览器升级后检查元素时无法以html方式进行编辑
- c++11 std::decay源码剖析
- Pandas常见筛选数据的五种方法其一逻辑筛选。看见必懂,懂者必会,会者必加分
- 3D建模师和3D动画师哪个职业前景好些?
- APICloud AVM多端开发 | 《外卖app开发》项目源码深度解析(上)
- 产业互联网,一次从需求侧向供给侧的自我嬗变
- Verilog HDL可综合描述(高质量Verilog书写)
- 上传文件- rz -be -y
- Dubbo 路由规则之条件路由