不是所有的牛奶的叫特仑苏,也不是所有的货的有这么(干)Java8 Collectors求和功能的自定义扩展操作

当业务需要对BigDecimal类型数据进行分类求和时,Java8原生的Collectors.summing*方法不适用。本文介绍如何自定义ToBigDecimalFunction接口和工具类,实现BigDecimal的相加功能。
摘要由CSDN通过智能技术生成

业务中需要将一组数据分类后收集总和,原本可以使用Collectors.summingInt(),但是我们的数据源是BigDecimal类型的,而Java8原生只提供了summingInt、summingLong、summingDouble三种基础类型的方法。

于是就自己动手丰衣足食吧。

自定义工具类

public class MyCollectors {
   
  private MyCollectors() {
   
  }
//  public static <T> Collector<T, ?, BigDecimal> summingBigDecimal(Function<? super T, BigDecimal> mapper) {}
    // BigDecimal 类型的集合求和
  public static <T> Collector<T, ?, BigDecimal> summingBigDecimal(ToBigDecimalFunction<? super T> mapper) {
   
    return new CollectorImpl<>(
        () -> new BigDecimal[] {
    BigDecimal.ZERO },
        (a, t) -> a[0] = a[0].add(mapper.applyAsInt(t)),
        (a, b) -> {
   
          a[0] = a[0].add(b[0]);
          return a;
        },
        a -> a[0],
        Collections.emptySet()
    );
  }
  static class CollectorImpl<T, A, R> implements Collector<T, A, R> {
   
    // 创建一个计算用的容器
    private final Supplier<A> supplier;
    // 计算逻辑
    private final BiConsumer<A, T> accumulator;
    // 合并逻辑
    private final BinaryOperator<A> combiner;
    // 返回最终计算值
    private final Function<A, R> finisher;
    // 空Set
    private final Set<Characteristics> characteristics;
    CollectorImpl(Supplier<A> supplier, BiConsumer<A, T> accumulator, BinaryOperator<A> combiner,
           Function<A, R> finisher, Set<Characteristics> characteristics) {
   
      this.supplier = supplier;
      this.accumulator = accumulator;
      this.combiner = combiner;
      this.finisher = finisher;
      this.characte
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值