如何在java 8项目中自定义收集器

  介绍

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


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

假定有这样一个BEAN

公共类SubjectOberser {
  私人字符串subjectKey;
  私人AbstractObserver AbstractObserver;
  …得到托架方法……
  }

我们需要按照subjectKey进行分组,分组过后的内容应该为这样一个容器<代码> Map<字符串,List

中映射的关键,为SubjectOberser属性的subjectKey,值为<代码> List

首先来看看收集器的接口定义

公共接口Collector{
  Supplier供应商();
  T> BiConsumer<;蓄电池();
  R> Function<;修整器();
  BinaryOperator合路器();
  Set特征();
  }

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

类型,是蓄电池返回的类型,即是累加器的返回类型

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

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

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

公共Function祝辞,
  Map<字符串,List 

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

公共Set特征(){
  返回Collections.unmodifiableSet (EnumSet.of (Characteristics.IDENTITY_FINISH));
  }

最终收集器代码合在一起就是:

如何在java 8项目中自定义收集器