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

简介

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

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

Collector介绍

我们先看一下Collector的定义:

@H_403_32@

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 Collector,Set> 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 > Collector> toImmutableSet(

Supplier supplier) {

return Collector.of(

supplier,Collections::unmodifiableSet);

}

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

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

@Test

public void toImmutableSetUsage(){

Set stringSet1=Stream.of("a","b","c","d")

.collect(ImmutableSetCollector.toImmutableSet());

log.info("{}",stringSet1);

Set stringSet2=Stream.of("a","d")

.collect(ImmutableSetCollector.toImmutableSet(LinkedHashSet::new));

log.info("{}",stringSet2);

}

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

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

总结

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

欢迎关注我的公众号:程序那些事,更多精彩等着您!

更多内容请访问 www.flydean.com

相关文章

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

java中collector使用_怎么在java中创建一个自定义的collector相关推荐

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

    文章目录 简介 Collector介绍 自定义Collector 总结 怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream ...

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

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

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

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

  4. java栈 类 堆_详细介绍Java中的堆和栈

    栈与堆都是Java用来在RAM中寄存数据的中央.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运转时数据区,类的对象从中分配空间.这些对象经过new.newar ...

  5. java替换数组中的元素_如何使用Java 8流快速替换列表中的元素

    java替换数组中的元素 假设您有一个项目清单: List<String> books = Arrays.asList("The Holy Cow: The Bovine Tes ...

  6. java数据类型怎样理解_深入理解Java之数据类型

    一.概述 我们通过编程解决一个具体问题时,首先要做的工作是用各种"数据结构"表示问题中的实体对象,而后才能着手研究描述具体业务逻辑的算法.这也正印证了"程序 = 数据结构 ...

  7. java聊天程序论文_【基于java的仿qq聊天程序的设计与实现论文最终版材料】

    基于java的仿qq聊天程序的设计与实现(论文)(最终版) <基于java的仿qq聊天程序的设计与实现(论文).doc>由会员分享,可免费在线阅读全文,更多与<基于java的仿qq聊 ...

  8. java匿名启动线程_使用匿名内部类:来创建线程的两种方式

    [Java]基础31:创建线程的两种方式 谢谢你的观看. 今天是我自学Java的第31天. 你的观看便是对我最大的鼓励. 话不多说,开始今天的学习: 线程的创建有两种方式,昨天学习过其中的一种: 创建 ...

  9. mysql中查找出生日期_如何在MySQL中根据出生日期记录显示日期名称?

    使用DAYNAME()显示具有出生日期的记录中的日期名称. 让我们首先创建一个表-mysql> create table DemoTable795 ( DateOfBirth date ); 使 ...

最新文章

  1. sklearn解决回归问题
  2. 开源网络爬虫WebCollector的demo
  3. CTF-杂项与密码学之工具使用汇总(三)
  4. 清华大学车辆刚才专业大佬教你如何写SCI论文(转)
  5. 蓝桥杯 基础练习 2n皇后
  6. 一般图最大匹配——带花树
  7. Jar 打包 EXE文件,可以脱离java环境运行 Jsmooth的使用
  8. (待完成)qbxt2019.05 总结2 - 数位DP
  9. 《SAS编程与数据挖掘商业案例》学习笔记之七
  10. P5787 二分图 /【模板】线段树分治(线段树分治、并查集)
  11. CSDN 统一标签设计 征求反馈
  12. 工作中遇到的问题--使用注解进行增加删除修改的验证
  13. thymealf如何实现传单个变量给html_50个关于IPython的奇技淫巧
  14. sqoop导入与导出总结
  15. Hadoop-2.0命令手册
  16. 轻快pdf阅读器如何使用
  17. 【TiDB@丰巢】支付平台的迁移之旅
  18. Supervisor使用简介
  19. 廊坊圣洁口去医院明星同款·隐形矫正试戴会圆满举办!
  20. ExtCertPathValidatorException: Could not validate certificate: null

热门文章

  1. onenote报错0XE000078D
  2. 2018-02-07 水仙花数与黄金比例分割
  3. pdf怎么分成多个文件?这个方法轻松搞定合并拆分PDF!
  4. HTML5 小练习2—仿华为官网(实现随机雪花飘落效果)
  5. python-新闻文本分类详细案例-(数据集见文末链接)
  6. 计算机最快键操作方法,电脑快捷键技巧
  7. python 利用datetime 模块计算时间差、当前时间多加一天、一小时、一分钟等操作
  8. 发什么视频可以吸引粉丝
  9. Mathtype添加下划线
  10. VIVADO中关于管脚约束错误的一种解决方法