如何在java8项目中自定义collector-成都快上网建站

如何在java8项目中自定义collector

本篇文章给大家分享的是有关如何在java 8项目中自定义collector,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

创新互联专注于邵武网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供邵武营销型网站建设,邵武网站制作、邵武网页设计、邵武网站官网定制、小程序开发服务,打造邵武网络公司原创品牌,更为您提供邵武网站排名全网营销落地服务。

需求:

将 一个容器List 按照一定的字段进行分组,分组过后的值为特定的BEAN 里面的属性例如:

假定有这样一个Bean

 public class SubjectOberser{
  private String subjectKey;
  private AbstractObserver abstractObserver;
  ...geter seter 方法...
 } 

我们需要按照 subjectKey 进行分组,分组过后的内容 应该为这样一个容器Map>

map 中的key,为SubjectOberser 属性的subjectKey,值为List

实现过程

首先来看看collector 的接口定义

类型 T ,是在容器里面元素的类型

类型 A ,是accumulator 返回的类型,即是累加器的返回类型

类型 R ,是最终结果的类型

supplier 方法返回的结果必须为一个空的Supplier,也就是一个空的无参函数(签名就是这样的 ()->{}),在调用的时候它会创建一个空的累加器(accumulator)实例,供数据收集的时候使用,很明显如果按照我们的需求试下你自己collector 这里应该返回一个 () -> new HashMap<>() ,一个Map 来收集结果

accumulator 方法返回归约操作的函数(签名是这样的 (a,b)->void ),当遍历到流中第n个元素时,这个函数执行时会有两个参数:保存归约结果的累加器(已 收集了流中的前n-1个项目),还有第n个元素本身。签名也展示该函数是void,因为该操作是在原来的容器里面进行更新的,所以返回的是void 类型。按照需求的中的实现应该是是这样的:

这里的逻辑就是if else  逻辑判断就是,这个key ,在map 中是否存在,如果不存在,那么我们需要给他new一个list 的实例,不然我的的数据没有地方存储

finisher 可从名字看出方法累积过程的最后要调用的一个函数,以便将累加器对象转换为整个集合操作的最终结果。通常来说累加器的类型也是返回的结果的类型,那么就返回identity 就可以了,如果不是的话,就行自行转换了。在当前需求的情况下我们的累加器和返回结果的类型是一致的,所以这里的实现是这样的:

combiner 方法是将两个累加的结果进行一个合并的过程,当然这个过程并不是每一个collector 都会调用得到(后面会讲到)
按照我们的需求,只需要将两个累加器的,中间结果合并成为一个结果即可,所以是现实这样的:

characteristics 该方法返回一个 Characteristics 的集合,它有如下值可选

    UNORDERED—— 归约结果不受流中项目的遍历和累积顺序的影响。

    CONCURRENT—— accumulator函数可以从多个线程同时调用,且该收集器可以并行执行。如果收集器没有标为UNORDERED,那 它仅在用于用于无序数据源时才可以并行归约。

    IDENTITY_ FINISH—— 这表明完成器方法返回的函数是一个不改变的函数,这种情况下,累加器对象将会直接用作合并过程 的最终结果。

最终collector 代码合在一起就是:

调用的过程就是:

直接在使用的地方直接new MyCollector 就可以了

以上就是如何在java 8项目中自定义collector,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


本文名称:如何在java8项目中自定义collector
本文来源:
http://kswjz.com/article/geddeg.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流