Collector interface源码分析

源码

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

说明: 1.T is the generic type of the items in the stream to be collected. 2.A is the type of the accumulator, the object on which the partial result will be accumulated during the collection process. 3.R is the type of the object (typically, but not always, the collection) resulting from the collect operation.

T:传入ParameterType,A:需要进行处理的Method,R:处理后Return的结果

特征值: CONCURRENT:并行的 UNORDERED:无序的 IDENTITY_FINISH:传入什么,Return什么

范例

toList()源码

1、入口

menu.stream().filter(t->t.isVegetarian()).collect(Collectors.toList())

2、Collectors.toList()Source Code:

    public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }

3、最后也就是CollectorInterface

        CollectorImpl(Supplier<A> supplier,
                      BiConsumer<A, T> accumulator,
                      BinaryOperator<A> combiner,
                      Set<Characteristics> characteristics) {
            this(supplier, accumulator, combiner, castingIdentity(), characteristics);
        }

流程图

1、CollectorExecute流程图 Collector

Execute过程: 1、通过Supplier supplierCreate一个ContainerContainer。 2、Viewstream里面是否还有元素。 3、如果有,通过带2个入参一个Return结果Parameter的BiConsumer<A, T> accumulator进行Data处理。 4、处理完后通过finisherReturnExecute结果。

collectSource Code:


    public final <R, A> R collect(Collector<? super P_OUT, A, R> collector) {
        A container;
        if (isParallel()
                && (collector.characteristics().contains(Collector.Characteristics.CONCURRENT))
                && (!isOrdered() || collector.characteristics().contains(Collector.Characteristics.UNORDERED))) {
            //获取容器
            container = collector.supplier().get();
            BiConsumer<A, ? super P_OUT> accumulator = collector.accumulator();
			//通过accumulator进行处理
            forEach(u -> accumulator.accept(container, u));
        }
        else {
            container = evaluate(ReduceOps.makeRef(collector));
        }
		//执行完,返回执行结果
        return collector.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)
               ? (R) container
               : collector.finisher().apply(container);
    }
    

2、combiner并行ExecuteExecute流程图 combiner

产生多个supplier并行处理,然后将多个处理结果combiner成一个,然后将结果Return。