当前位置: 代码迷 >> 综合 >> Stream collect 核心源码解读
  详细解决方案

Stream collect 核心源码解读

热度:56   发布时间:2023-12-12 04:46:19.0

使用示例代码

        //一个string数组流对象Stream<String> streamList = Stream.of("aa","bb","cb","dg");/*** 第一个参数: 接受一个需要返回的类型的空对象 ,作为最后返回的容器* 第二个参数: 获取当前流中的元素,存入到容器【第一个对象】* 第三个参数: 猜测:1、因为流支持链式编程  2、为了支持并行流*  第三个参数,会将之前的流处理的返回结果集合并的当前容器【第一个参数】,* 最后返回包含所有数据的集合*/List<String> list1 = streamList.collect(() -> new ArrayList(),(theList,item) -> theList.add(item),(theList,theList2) ->theList.addAll(theList2));

接口中用到的函数式接口简介

//没有入参,返回一个需要的对象 
@FunctionalInterface
public interface Supplier<T> {
     T get(); }//两个入参,通过accept实现类处理 ,无出参
@FunctionalInterface
public interface BiConsumer<T, U> {
     void accept(T t, U u); }

源码解析

Stream类中的接口

<R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner);

实现类 : 主要调用了ReduceOps.makeRef

supplier :供应商
accumulator: 蓄电池
combiner : 组合器,合成仪

abstract class ReferencePipeline<P_IN, P_OUT>extends AbstractPipeline<P_IN, P_OUT, Stream<P_OUT>>implements Stream<P_OUT>  {
    @Overridepublic final <R> R collect(Supplier<R> supplier,BiConsumer<R, ? super P_OUT> accumulator,BiConsumer<R, R> combiner) {
    return evaluate(ReduceOps.makeRef(supplier, accumulator, combiner));}
}

ReduceOps.makeRef 方法解析

   seed : 种子、起源  --- 将初始容器作为赋值给需要返回的对象stateaccumulator: 蓄电池 : 调用用户实现的accept方法【theList.add(item)】reducer:还原剂;减速器; 调用用户实现的accept方法【theList.addAll(theList2)】
public static <T, R> TerminalOp<T, R>makeRef(Supplier<R> seedFactory,BiConsumer<R, ? super T> accumulator,BiConsumer<R,R> reducer) {
         // ReducingSink  Box 两个内部类  class ReducingSink extends Box<R>implements AccumulatingSink<T, R, ReducingSink> {
    @Overridepublic void begin(long size) {
    state = seedFactory.get();}@Overridepublic void accept(T t) {
    accumulator.accept(state, t);}@Overridepublic void combine(ReducingSink other) {
    reducer.accept(state, other.state);}}return new ReduceOp<T, R, ReducingSink>(StreamShape.REFERENCE) {
    @Overridepublic ReducingSink makeSink() {
    return new ReducingSink();}};}

ReduceOps内部类Box

    private static abstract class Box<U> {
    //最终返回state对象U state;public U get() {
     return state; }}
  相关解决方案