简介

在之前的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  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,                Set::add, (left, right) -> {                    left.addAll(right);                    return left;                }, 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","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的实例,希望能对大家有所帮助。

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

更多内容请访问:flydean的博客 flydean.com

java全局变量怎么定义_怎么在java中创建一个自定义的collector相关推荐

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

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

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

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

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

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

  4. java静态数组定义_详解Java静态数组

    说到Java静态数组,我们第一时间可能就会想到相应的动态数组,两者看上去挺相似,实质却大不一样.Java静态数组是一定义出来就创建了,而动态数组则是定义时不创建,使用时才创建,一定意义上节省了内存空间 ...

  5. 用java画网状图_如何在背景中绘制一个带网格线的漂亮条形图?

    我是Matlab的新手 . 我做了一个实验 . 我需要帮助将结果绘制在2条形图(具有不同颜色)中,结果图形需要有网格线 . 有人建议使用非常matlap的代码输出一个漂亮的情节吗? 数据如下: x轴是 ...

  6. mysql auto_increment建表_在mysql表中创建一个ID auto_increment(在事实之后)

    小编典典 例如,这是一个具有主键但不是的表AUTO_INCREMENT: mysql> CREATE TABLE foo ( id INT NOT NULL, PRIMARY KEY (id) ...

  7. python制作一个计时器_如何在python中创建一个反应计时器作为GUI?

    我有一个反应计时器的问题.我想在我的程序中有一个按钮,它能告诉我从定时器开始按下按钮所花的时间.在 假设我打开我的程序,我想要一个按钮,如果我点击它,它将打印出计时器启动后我按下它所花的时间.然后在我 ...

  8. iar怎么新建立项目_请简述IAR中创建一个应用项目的步骤及配置过程。

    [多选题]公路工程中应用的石灰要求达到( ). [多选题]在石灰工业废渣稳定土施工前,取有代表性石灰样品进行下列试验( ). [单选题]在沥青混合料中掺加适量消石灰粉,可以有效提高沥青混合料的( ). ...

  9. Java全局变量怎么定义?什么是全局变量?

    Java的面向对象的代码结构会使在多个位置引用变量更加困难.有时也很难确定给定变量应属于哪个类,尤其是当它是一个广泛使用的值(例如数据库连接器或数学常数)时. Java全局变量怎么定义? 在许多语言中 ...

最新文章

  1. Windows Embedded Standard开发初体验(二)
  2. 《强化学习周刊》第25期:DeepMind提出无模型风险敏感强化学习、谷歌发布 RLDS数据集生态系统...
  3. c++类的实例化,有没有new的区别
  4. DL之DNN优化技术:神经网络算法简介之GD/SGD算法(BP的梯度下降算法)的简介、理解、代码实现、SGD缺点及改进(Momentum/NAG/Ada系列/RMSProp)之详细攻略
  5. php命名空间规则解析及高级功能,PHP命名空间解析规则
  6. windows10配置php7.1+apache2.4+mysql5.7
  7. Android UI开发第二十七篇——实现左右划出菜单
  8. 使用EntityFrameworkCore实现Repository, UnitOfWork,支持MySQL分库分表
  9. 尤金·卡巴斯基:卡巴斯基实验室调查内网遭黑客攻击事件
  10. Android两次按返回键退出应用程序
  11. arcgis加载天地图_【arcgis地图实战】之天地图在线服务加载
  12. centos 6.5 编译php mysql5.6_CentOS6.5 编译安装PHP5.6(apache模块)
  13. android 不限速迅雷,迅雷不限速分享(手机+PC端打包) – 长期更新
  14. 职称评审要满足什么条件
  15. windows下如何创建bat文件
  16. esp32触摸touch功能使用过程详述arduino
  17. 【培训版】《最强大脑记忆力训练教程》[2017年7月份更新]
  18. <冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)
  19. 据说99%的程序猿都不懂得这样表白
  20. Web自动化测试模式page object的小利器:gizmo

热门文章

  1. 使用命令行加载 jMeter 自定义配置文件里的自定义 property
  2. Angular 依赖的测试和 Fake
  3. 什么是TypeScript的字符串索引签名
  4. SAP Data Intelligence API执行出错的排错之道
  5. SAP Fiori Elements - smart control demo1 currency field - how is manifest.json loaded
  6. 自己写的一个报表,研究SAP CRM ibase保存问题
  7. hybris backoffice搜索时遇到could not execute full-text query的解决方案
  8. SAP UI5 BindingParser
  9. local sandbox html里的script tag是如何load到memory里的
  10. S/4HANA的生产订单,哪个字段可以用来做生产完成的标志位