java stream Interface Collector<T,A,R>

Interface Collector<T,A,R>
T:输入的类型
A:中间存放数据的容器
R:输出的类型

Collector通过下面四个方法协同工作以完成汇聚操作:
supplier: 创建新的结果容器
accumulator:将输入元素合并到结果容器中
combiner:合并两个结果容器(并行流使用,将多个线程产生的结果容器合并)
finisher:将结果容器转换成最终的表示

在这里插入图片描述

    @Override
    @SuppressWarnings("unchecked")
    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();
            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);
    }
    public static <T, I> TerminalOp<T, I>
    makeRef(Collector<? super T, I, ?> collector) {
        Supplier<I> supplier = Objects.requireNonNull(collector).supplier();
        BiConsumer<I, ? super T> accumulator = collector.accumulator();
        BinaryOperator<I> combiner = collector.combiner();
        class ReducingSink extends Box<I>
                implements AccumulatingSink<T, I, ReducingSink> {
            @Override
            public void begin(long size) {
                state = supplier.get();
            }

            @Override
            public void accept(T t) {
                accumulator.accept(state, t);
            }

            @Override
            public void combine(ReducingSink other) {
                state = combiner.apply(state, other.state);
            }
        }
        return new ReduceOp<T, I, ReducingSink>(StreamShape.REFERENCE) {
            @Override
            public ReducingSink makeSink() {
                return new ReducingSink();
            }

            @Override
            public int getOpFlags() {
                return collector.characteristics().contains(Collector.Characteristics.UNORDERED)
                       ? StreamOpFlag.NOT_ORDERED
                       : 0;
            }
        };
    }

参考:
java8新特性(四) Collector(收集器)
Java8中重要的收集器collector
JAVA8学习9-自定义收集器(Characteristics 使用说明)

`summarizingBigDecimal()`方法通常涉及使用Java 8的Stream API来进行数据收集和汇总,这里的`Collector`接口允许我们定制聚合操作。如果该方法返回`Collector<? super T, A, D>`,那么它可能是在构建一个可以处理`BigDecimal`流的收集器,`T`通常就是`BigDecimal`类型,而`A`和`D`分别代表中间结果类型和最终结果类型。 `Function<T, R>`可能被用于转换每个`BigDecimal`元素到另一种形式,比如将其转换为double或其他便于处理的数据类型。下面是一个简单的示例,假设`Function`用于获取每个`BigDecimal`的绝对值作为中间结果: ```java import java.math.BigDecimal; import java.util.stream.Collector; import java.util.stream.Collectors; public class BigDecimalSummary { public static Collector<BigDecimal, ?, Map<String, BigDecimal>> summarizingAbsValues() { return Collectors.collectingAndThen(Collectors.summingBigDecimal(BigDecimal::abs), results -> { Map<String, BigDecimal> map = new HashMap<>(); map.put("Sum of Absolute Values", results); return map; }); } public static void main(String[] args) { List<BigDecimal> numbers = Arrays.asList(BigDecimal.valueOf(10), BigDecimal.valueOf(-5), BigDecimal.ONE); Map<String, BigDecimal> summary = summarizingAbsValues().apply(numbers); System.out.println(summary); // {Sum of Absolute Values=16} } } ``` 在这个例子中,`Function<BigDecimal, Double>`是`BigDecimal::abs`,它会应用绝对值函数到每个元素上。然后`Collectors.summingBigDecimal()`用于累积绝对值,最后通过`collectingAndThen`来构造并返回结果映射。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值