【Java8 Stream】:探秘Stream实现的核心:Collector,模拟Stream的实现



Stream的用法可以参考下文:




前言

本篇还处于待完善阶段,目前仅仅是使用了自己的方法来实现Stream对流的处理。因此暂时先写一篇文章做记录。




Collector的基础知识

Collector<T, A, R>范型的含义:

  • <T>:规约操作(reduction operation)的输入元素类型
  • <A>:是规约操作的输出结果类型,该类型是可变可累计的,可以是各种集合容器,或者具有累计操作(如add)的自定义对象。
  • <R>:规约操作结果经过转换操作后返回的最终结果类型

Collector中方法定义,下面的方法的返回值都可以看作函数(function):

  • Supplier<A> supplier():该函数创建并返回新容器对象。
  • BiConsumer<A, T> accumulator():该函数将把元素值放入容器对象,并返回容器。
  • BinaryOperator<A> combiner():该函数会把两个容器(此时每个容器都是处理流元素的部分结果)合并,该函数可以返回这两个容器中的一个,也可以返回一个新的容器。
  • Function<A, R> finisher():该函数将执行最终的转换,它会将combiner的最终合并结果A转变为R。
  • Set<Characteristics> characteristics():提供集合列表,该列表将提供当前Collector的一些特征值。这些特征将会影响上述函数的表现。

上述函数的语法:

  • Supplier<T>#T get():调用一个无参方法,返回一个结果。一般来说是构造方法的方法引用。
  • BiConsumer<T, U>#void accept(T t, U u):根据给定的两个参数,执行相应的操作。
  • BinaryOperator<T> extends BiFunction<T,T,T>#T apply(T t, T u):合并t和u,返回其中之一,或创建一个新对象放回。
  • Function<T, R>#R apply(T t):处理给定的参数,并返回一个新的值。




Collector源码

public interface Collector<T, A, R> {
   
   

    Supplier<A> supplier();
    
    BiConsumer<A, T> accumulator();

    BinaryOperator<A> combiner();

    Function<A, R> finisher();

    Set<Characteristics> characteristics();
   }
// Collector#Characteristics
enum Characteristics {
   
   
	// 表明Collector是否用于并发
    CONCURRENT,
    // 表明Collector是否会保留原容器的顺序
    UNORDERED,
    // 表明accumulator函数结果类型是否等于finisher函数,默认为空,当设置该特征时,那么finisher函数将执行A到R的未经检查的强制转换。
    IDENTITY_FINISH
}




一个简单的Collector实现类

Collector的实现类很简单,它将用于存储用户输出的各项函数。

public class SimpleCollector<T, A, R> implements Collector<T, A, R> {
   
   

    private final Supplier<A> supplier;

    private final BiConsumer<A, T> accumulator;

    private final BinaryOperator<A>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值