文章目录

  • 简介
  • 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相关推荐

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

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

  2. java中collector使用_怎么在java中创建一个自定义的collector

    怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或 ...

  3. java全局变量怎么定义_怎么在java中创建一个自定义的collector

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

  4. 如何在Java中创建一个新的List

    本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...

  5. html中模块怎么创建,在Joomla中创建一个自定义HTML模块,不显示

    我有几个Joomla!我感到有信心的网站.我的Joomla!网站有一个artisteer模板. 我最近做了一个"戳出"的图片,突出了纸张的边缘,并展示了一个android" ...

  6. java创建临时文件夹_如何在Java中创建一个临时目录/文件夹?

    有没有在Java应用程序内部创建临时目录的标准可靠方法? Java的问题数据库中有一个条目,注释中包含一些代码,但是我想知道在一个常用的库(Apache Commons等)中是否找到标准解决方案? # ...

  7. Java乐谱_如何在java中创建一个简单但结构良好的乐谱表(乐谱)?

    我正在使用非常基本的声音合成在我的游戏中创建音频和效果.基本上,我有一些方法可以发出一个频率和频率的声音.幅度和幅度持续时间. 对于短语和旋律,我想提出一个基本的符号,这样我就可以轻松地重写或添加新的 ...

  8. 如何在K8S中创建一个自定义Controller?

    目的 CRD资源定义 代码生成 Controller编写 目的 Custom Resource是扩展Kubernetes的一种方式(另外一种就是通过聚合层API apiserver-aggregati ...

  9. 在mysql中创建一个自定义函数来计算两个数的和_Mysql创建自定义函数

    Mysql创建用户自定义函数: >显示库中所有的自定义函数信息: show function status; >创建自定义函数的过程如下demo1: drop function if ex ...

最新文章

  1. cf375D. Tree and Queries
  2. 软考网络管理员学习笔记5之第五章广域网与接入网技术
  3. 提高Eclipse的速度,去掉对于工程的 Validatioan
  4. _RecordsetPtr
  5. 深度学习TF—13.对抗生成网络—GAN
  6. DrawText如何使多行文字居中
  7. 把oa系统部署到云服务器,oa系统怎么部署到云服务器
  8. ubuntu硬盘序列号怎么查询_如何在Linux中查找硬盘的详细信息?
  9. 下载安装php详细教程(在安装配置apache之后)
  10. 学习嵌入式单片机需要学习哪些内容?
  11. 共享计算机怎么连,电脑如何连接共享文件
  12. Chrom浏览器升级后检查元素时无法以html方式进行编辑
  13. c++11 std::decay源码剖析
  14. Pandas常见筛选数据的五种方法其一逻辑筛选。看见必懂,懂者必会,会者必加分
  15. 3D建模师和3D动画师哪个职业前景好些?
  16. APICloud AVM多端开发 | 《外卖app开发》项目源码深度解析(上)
  17. 产业互联网,一次从需求侧向供给侧的自我嬗变
  18. Verilog HDL可综合描述(高质量Verilog书写)
  19. 上传文件- rz -be -y
  20. Dubbo 路由规则之条件路由

热门文章

  1. python基础语法-异常处理
  2. 【项目源码分享】基于C++实现的网店购物管理系统(VS2019控制台)
  3. 数塔问题和最长上升子序列问题
  4. VC编译的除法的一段汇编代码解释
  5. ptrace 系统调用
  6. UDT协议实现分析——UDT初始化和销毁
  7. 如何成为一名大厂的优秀员工?
  8. 微服务架构统一安全认证设计与实践
  9. 阿里开源的Arthas竟然还不会用?最佳实践来了!
  10. docker 容器基础技术