StreamAPI 处理 BigDecimal 的 add 操作

泥瓦匠BYSocket

共 1320字,需浏览 3分钟

 ·

2020-10-29 09:19


来源 | 公众号「锅外的大佬」

1. 引言

我们通常使用Java  Stream API  来处理数据集合。

一个不错的特性是支持对数字流的操作,比如sum操作。但是,我们不能以这种方式处理所有数值类型

在本文中,我们将了解如何对诸如BigDecimal之类的数字流执行sum操作。

2. 如何用流求和

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。**所以,我们需要另一个解决方案。

3. 使用Reduce添加BigDecimal数字

我们使用 *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 – 接受两个参数,目前为止的结果,以及流的下一个元素

4. Conclusion

本文中,我们研究了如何在数字中计算数字之和。以及如何使用reduce作为替代。

【墙裂推荐】

专注于「开发者」综合成长的深度星球限时优惠进行中

最近热门内容回顾   #技术人系列

79570829767d09ba2d9a6401af45f0e0.webp



下方二维码关注我

52a50514823e504cccb0093f9b976496.webp

互联网草根,坚持分享技术创业产品心得和总结~



f5b9855a85649d2a318db4d966f0aba9.webp

点击“阅读原文”,领取 2020 年最新免费技术资料大全

↓↓↓ 
浏览 62
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报