我们通常使用Java Stream API 来处理数据集合。
一个不错的特性是支持对数字流的操作,比如sum操作。但是,我们不能以这种方式处理所有数值类型
在本文中,我们将了解如何对诸如BigDecimal之类的数字流执行sum操作。
Stream API 提供数字流 numbers Stream,包括 IntStream、DoubleStream、和LongStream我们通过创建一个数字流来来搞清楚它们是如何工作的。然后,我们用 [IntStream#sum] 计算它的总数:
IntStream intNumbers = IntStream.range(0, 3);
assertEquals(3, intNumbers.sum());
我们可以从Doubles的列表开始执行类似的操作。通过使用streams,我们可以使用 mapToDouble 将对象流转换为Double stream:
List doubleNumbers = Arrays.asList(23.48, 52.26, 13.5);
double result = doubleNumbers.stream()
.mapToDouble(Double::doubleValue)
.sum();
assertEquals(89.24, result, .1);
所以,如果我们能用同样的方法总结出一组 BigDecimal 数字,那就很有用了。
**不幸的是,没有BigDecimalStream。**所以,我们需要另一个解决方案。
我们使用 *Stream.reduce*来计算sum:
Stream intNumbers = Stream.of(5, 1, 100);
int result = intNumbers.reduce(0, Integer::sum);
assertEquals(106, result);
这适用于任何可以逻辑相加的数据,包括BigDecimal:
Stream bigDecimalNumber =
Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
BigDecimal result = bigDecimalNumber.reduce(BigDecimal.ZERO, BigDecimal::add);
assertEquals(11, result);
reduce方法有两个参数:
Identity – 等于0–它是还原的起始值
Accumulator function – 接受两个参数,目前为止的结果,以及流的下一个元素
本文中,我们研究了如何在数字流中计算数字之和。以及如何使用reduce作为替代。
最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!
•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术群讨论
•Java 线上故障排查完整套路•SQL 进阶技巧(下)•SQL 进阶技巧(上)•干掉Navicat:这个IDEA的兄弟真香!•微服务项目搭建,到底要不要聚合工程?•一文读懂阿里大中台、小前台战略
喜欢就点个"在看"呗^_^