Collectors 收集器接口

本文详细介绍了Java Stream API中的Collector接口,包括supplier、accumulator、finisher、combiner方法及其在自定义收集器中的作用。解释了如何创建一个ToListCollector,用于将流中的元素收集到List中,并讨论了Collector的特性如UNORDERED、CONCURRENT和IDENTITY_FINISH的含义及影响。此外,文章还比较了直接使用函数式接口创建收集器与实现完整Collector接口的区别。
摘要由CSDN通过智能技术生成

收集器接口

你可以为Collectors接口提供自己的实现,从而自由地创建自定义归约操作。

public interface Collector<T, A, R> {
    Supplier<A> supplier();
    BiConsumer<A, T> accumulator();
    Function<A, R> finisher();
    BinaryOperator<A> combiner();
    Set<Characteristics> characteristics();
}

本列表使用一下定义:

  • T 是流中要收集的项目的泛型
  • A 是累加器的类型,累加器是在收集过程中用于累积部分结果的对象。
  • R 是收集操作得到的对象(通常但不一定是集合)的类型。

例如你可以实现一个ToListCollector类,将Stream中的所有元素收集到一个List里,它的签名如下:

public class ToListCollector<T> implements Collector<T, List<T>, List<T>>

理解Collector 接口声明的方法

前四个方法都会返回一个被collect方法调用的函数,而第五个方法characteristics则提供了一系列特征,也就是一个提示列表,告诉collect方法在执行归约操作的时候可以应用哪些优化(比如并行化)。

1.建立新的结果容器:supplier方法

supplier方法必须返回一个结果为空的Supplier,也就是一个无参数函数,在调用时他会创建一个空的累加器实例,供数据收集过程使用。

对于将累加器本身作为结果返回的收集器,比如我们的ToListCollector,在对空流执行操作的时候,这个空的累加器也代表了收集过程的结果,在我们的ToListCollector中,supplier返回一个空的List

public Supplier<List<T>> supplier() {
    return ArrayList::new;
}
2. 将元素添加到结果容器:accumulator方法

accumulator(积聚者、收集器)方法会返回执行归约操作的函数。当遍历到流中第n个元素时,这个函数执行时会有两个参数:保存归约结果的累加器(已收集了流中的前n-1个项目),还有第n个元素本身。该函数将返回void,因为累加器是原位更新,即函数的执行改变了它的内部状态以体现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值