自定义Collector

自定义Collector

在Java8的特性中,使用了新的API,其中就有Stream,在偶然的机会下看到思否大佬对自定义Collector写下的文章,惊为天人。

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

自定义收集器需要实现Collector接口,其中包含5个Function接口

package function;

import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;

/**
 * @Description 自定义收集器
 * @Authror taren
 * @DATE 2019/7/5 9:24
 */
public class CustomCollectors {

public static  Collector>, List>> groupByNumber() {
    return CustomCollectors.groupByNumber(2);
}

public static  Collector>, List>> groupByNumber(int number) {
    return new NumberCustomCollector(number);
}

public static class NumberCustomCollector implements Collector>, List>> {

    private int number;

    public NumberCustomCollector(int number) {
        this.number = number;
    }
    //传入一个泛型 List -> new ArrayList
    //Supplier 传入一个泛型  得到一个泛型的类型  T get()
    @Override
    public Supplier>> supplier() {
        return ArrayList::new;
    }

    //BiConsumer -> void accept(T,R) 实现累加器
    @Override
    public BiConsumer>, T> accumulator() {
        return (list, item) -> {
            if (list.isEmpty()) {
                list.add(this.createNewList(item));
            } else {
                List last = (List) list.get(list.size() - 1);
                if (last.size() < number) {
                    last.add(item);
                } else {
                    list.add(this.createNewList(item));
                }
            }
        };
    }

    //组合  R apply(T t, U u)  2个类型组合成另外一个新的类型
    @Override
    public BinaryOperator>> combiner() {
        return (list1, list2) -> {
            list1.addAll(list2);
            return list1;
        };
    }

    // 用自身 就是t->t 还是本身的类型 不是t->other
    @Override
    public Function>, List>> finisher() {
        return Function.identity();
    }

    // 表示 Function.identity() 就是收集的最终类型 不再做最终的转换
    @Override
    public Set characteristics() {
        return Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));
    }

    private List createNewList(T item) {
        List newOne = new ArrayList();
        newOne.add(item);
        return newOne;
    }
}

public static void main(String[] args) {
    List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    // 按照2个分组
    List> twoNumberList = list.stream().collect(CustomCollectors.groupByNumber());
    // 按照5个分组
    List> fiveNumberList = list.stream().collect(CustomCollectors.groupByNumber(5));

    System.out.println(twoNumberList);
    System.out.println(fiveNumberList);
}
}

Supplier是一个FunctionInterface,表达是的提供一个初始化的容器,但在这里是创建一个累加器,即

List list=new ArrayList<>()

BiConsumer是把一个类型的东西添加到累加器中,即是

list.add(item)

BinaryOperator是把一个累加器和另一个累加器合并到一起,即是

list.add(otherList)

Function是把一个结果转化为另外一个结果,但是在这里是

t->t

Set是一个枚举类,在这里表示Function转化的就是最终的结果

你可能感兴趣的:(自定义Collector)