Collectors扩展接口 实现BigDecimal的相加

第一步创建 ToBigDecimalFunction接口

import java.math.BigDecimal;

@FunctionalInterface

public interface ToBigDecimalFunction {

BigDecimal applyAsBigDecimal(T value);

}

第二步 创建工具类 实现接口

import java.math.BigDecimal;

import java.util.Collections;

import java.util.Set;

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;

public class CollectorsUtil {

static final Set CH_NOID = Collections.emptySet();

private CollectorsUtil() {

}

@SuppressWarnings("unchecked")

private static Function castingIdentity() {

return i -> (R) i;

}

/**

* Simple implementation class for {@code Collector}.

*

* @param

* the type of elements to be collected

* @param

* the type of the result

*/

static class CollectorImpl implements Collector {

private final Supplier supplier;

private final BiConsumer accumulator;

private final BinaryOperator combiner;

private final Function finisher;

private final Set characteristics;

CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner,

Function finisher, Set characteristics) {

this.supplier = supplier;

this.accumulator = accumulator;

this.combiner = combiner;

this.finisher = finisher;

this.characteristics = characteristics;

}

CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner,

Set characteristics) {

this(supplier, accumulator, combiner, castingIdentity(), characteristics);

}

@Override

public BiConsumer accumulator() {

return accumulator;

}

@Override

public Supplier supplier() {

return supplier;

}

@Override

public BinaryOperator combiner() {

return combiner;

}

@Override

public Function finisher() {

return finisher;

}

@Override

public Set characteristics() {

return characteristics;

}

}

public static Collector summingBigDecimal(ToBigDecimalFunction super T> mapper) {

return new CollectorImpl<>(() -> new BigDecimal[1], (a, t) -> {

if (a[0] == null) {

a[0] = BigDecimal.ZERO;

}

a[0] = a[0].add(mapper.applyAsBigDecimal(t));

}, (a, b) -> {

a[0] = a[0].add(b[0]);

return a;

}, a -> a[0], CH_NOID);

}

}

使用测试

import com.example.javademo.JavaDemoApplicationTests;

import com.example.javademo.pojo.Student;

import com.example.javademo.utils.DataUtils;

import org.junit.Test;

import java.math.BigDecimal;

import java.util.stream.Collectors;

public class TestBigDecimal extends JavaDemoApplicationTests {

@Test

public void testGroupByAfterBigdecimal(){

/*

自定义实现对分组后的集合,属性为bigdecmal进行相加

*/

System.out.println(DataUtils.getData().stream().collect(Collectors.groupingBy(Student::getSchool,CollectorsUtil.summingBigDecimal(Student::getMoney))));

//归约造作

BigDecimal reduce = DataUtils.getData().stream().map(Student::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);

System.out.println(reduce);

int sum = DataUtils.getData().stream().mapToInt(Student::getAge).sum();

System.out.println(sum);

}

}

collectors 求和_Collectors扩展接口 实现BigDecimal的相加相关推荐

  1. collectors 求和_Collectors.groupingBy() 分组、求和、统计、平均、最大(小)值

    public classgroupingBy {public static voidmain(String[]args) {ArrayListlist = newArrayList<>() ...

  2. java 相加的函数_Java8 Collectors求和功能的自定义扩展操作

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

  3. JEE6 CDI 扩展实现 MVC (四) 实现多模板引擎支持,并提供扩展接口

    为什么80%的码农都做不了架构师?>>>    在上一篇中,我们添加了对 Freemarker的支持,这里我们再添加多 Velocity 的支持,同时留出扩展接口.方便用户自己添加模 ...

  4. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  5. 动态管理配置文件扩展接口EnvironmentPostProcessor

    SpringBoot支持动态的读取文件,留下的扩展接口org.springframework.boot.env.EnvironmentPostProcessor.这个接口是spring包下的,使用这个 ...

  6. java 扩展接口_详解常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  7. SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)

    微信公众号:吉姆餐厅ak 学习更多源码知识,欢迎关注. SpringBoot2 | SpringBoot启动流程源码分析(一) SpringBoot2 | SpringBoot启动流程源码分析(二) ...

  8. Spring - InstantiationAwareBeanPostProcessor 扩展接口

    文章目录 Pre org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor InstantiationA ...

  9. Spring - BeanFactoryPostProcessor 扩展接口

    文章目录 Pre org.springframework.beans.factory.config.BeanFactoryPostProcessor 源码探究 1 是否实现BeanDefinition ...

最新文章

  1. 犀利哥”与“一个流浪汉的国家葬礼”
  2. js中propertyIsEnumerable()方法使用介绍
  3. Java文件删除操作File#delete()
  4. 事件委托能够优化js性能
  5. VirtualBox没有64位选项,无法安装64位的解决方法 感谢源作者
  6. 细胞分裂java移植_胚胎移植前,先调理好你的子宫内膜!
  7. 转:如何用C#语言构造蜘蛛程序
  8. 获取IPhone相册中图片的方法(包括获取所有图片)
  9. linux 关闭scp服务器,Linux系统如何关闭scp和sftp命令
  10. C语言极坐标转直角坐标,C语言实现直角坐标转换为极坐标的方法
  11. linux中设备配额 磁盘加密
  12. 虚拟服务器ftp文件权限修改,虚拟主机用户ftp和apache用户文件互操作权限解决方法...
  13. Keil5编译环境搭建流程----STM32和GD32
  14. OpenCV.js 视频入门
  15. 51单片机温控风扇仿真原理图 C语言程序,51单片机温控风扇(含程序+原理图+仿真+PCB)...
  16. 如何创建删不掉文件夹
  17. python下载第三方库超时报错pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=‘files.pyt
  18. c++ stl源码-我理解的空间配置器
  19. 两个鸡蛋和一百层楼的问题
  20. 常用字写法(粤语)--(1)

热门文章

  1. android studio生成签名导打包的方法
  2. Linux 文件夹权限
  3. 运行时错误7内存溢出_C++程序运行时的内存模型
  4. mpi4py linux例子,python-3.x – mpi4py中的共享内存
  5. r语言 运算符_R语言运算符
  6. getlanguage_Java语言环境getLanguage()方法与示例
  7. math.pow int_Java Math类static int min(int i1,int i2)与示例
  8. python变量和常量_Python数学模块常量和示例
  9. python程序需要编译么_python需要编译么
  10. rofl用什么播放_ROFL的完整形式是什么?