首页 > 编程语言 >Java8中Collectors求和功能的自定义扩展

Java8中Collectors求和功能的自定义扩展

时间:2022-12-03 23:31:12浏览次数:49  
标签:combiner return BigDecimal Collectors Java8 accumulator supplier public 自定义


业务中需要将一组数据分类后收集总和,原本可以使用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.characteristics = characteristics;
}

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

@Override
public BiConsumer<A, T> accumulator() {
return accumulator;
}

@Override
public Supplier<A> supplier() {
return supplier;
}

@Override
public BinaryOperator<A> combiner() {
return combiner;
}

@Override
public Function<A, R> finisher() {
return finisher;
}

@Override
public Set<Characteristics> characteristics() {
return characteristics;
}
}

@SuppressWarnings("unchecked")
private static <I, R> Function<I, R> castingIdentity() {
return i -> (R) i;
}

}

 

自定义函数式接口

@FunctionalInterface
public interface ToBigDecimalFunction<T> {
BigDecimal applyAsInt(T value);
}

 

测试入口

public class AnswerApp {
public static void main(String[] args) {
List<BigDecimal> list = Lists.newArrayList();
for (int i = 0; i < 24; i++) {
list.add(BigDecimal.valueOf(i + 10.2121543));
}

// 方式1
BigDecimal sum = list.stream().collect(MyCollectors.summingBigDecimal(e -> e));
System.out.println(sum.doubleValue());

// 方式2
Optional<BigDecimal> reduce = list.stream().reduce(BigDecimal::add);
System.out.println(reduce.orElse(BigDecimal.valueOf(0)));
}
}

// OUTPUT: 521.0917032

 

参考地址

  • ​​Java8中Collectors求和功能的自定义扩展​​


标签:combiner,return,BigDecimal,Collectors,Java8,accumulator,supplier,public,自定义
From: https://blog.51cto.com/u_15891990/5908836

相关文章

  • arco design vue 表单自定义验证
    不知道为啥,官方文档里竟然没写...直接上代码template里<a-form-itemfield="repeatPassword":rules="[{validator:validateRepeatPassword,trigger:'change'}]"......
  • Dockerfile自定义镜像
    常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。而要自定义镜像,就必须先了解镜像的结构才行。1.镜像结构镜像是将应用程序及其需要的系统函......
  • 自定义allure报告logo
    为了在测试报告中凸显公司的标识,可以自定义修改allure报告中,左上角部分的图片和文字。左上角内容由两部分组成,图片(左)和文字(右),均可修改。  一、上传图片路径:allure文......
  • Google Chrome 自定义快捷键
    1.chrome应用商店下载插件Shortkeys   2.进入chrome扩展自定义快捷键功能页面:chrome://extensions/shortcuts。找到自己想要修改的快捷键,点击小铅笔完成修改,即......
  • SpringBoot 适配 MyBatis 分页插件功能(自定义拦截器方式)
    文章目录​​1.自定义分页插件​​​​1.1.application.properties添加mybatis属性​​​​1.2.mybatis-config.xml配置文件​​​​1.3.分页拦截器类PagePlugin​......
  • Dockerfile自定义镜像、CentOS安装DockerCompose及Docker镜像仓库
    目录​​一、Dockerfile自定义镜像​​​​案例:基于java:8-alpine镜像,将一个Java项目构建为镜像​​​​二、CentOS安装DockerCompose​​​​案例:将cloud-demo微服务集群利......
  • Java8 时间操作总结
    目录:​​1.获取当天日期​​​​2.获取当前时间​​​​3.获取当前日期和时间​​​​4.日期时间格式化​​​​5.构造指定日期或者时间​​​​6.获取年月日信息​......
  • Java8时间 实体类使用LocalDate接收String字符串时间 小记
    1.时间类型映射问题。遇到这个问题是由于在实体类中将时间类型改为​​LocalDateTime​​​或者​​LocalDate​​​之后,自动生成的dao文件中该字段对应的时间类型为​​TI......
  • 自定义的Qt时间轴控件
    这是一个垂直的时间轴,显示效果非常简单,但不能显示有格式的文本。如果想显示有格式文本可以把右侧显示本文的位置换成QLabel控件去显示有格式文本。如果想改变文本行间距,根......
  • 自定义hooks
    importReact,{useState,useEffect}from'react';exportconstuseStateHooks=(val:any)=>{  let[value,setValue]=useState(val);  constsetFunc=(v:any)=......