1. 概述
我们通常使用Java Stream API来处理数据集合。
一个不错的功能是支持对数字流的操作,比如求和操作。但是,我们不能以这种方式处理所有数字类型。
在本教程中,我们将了解如何对BigDecimal等数字流执行求和运算。
2. 我们通常如何对流求和
Stream API提供数字流,包括IntStream、DoubleStream和LongStream。
让我们创建一个数字流,然后,我们将使用IntStream#sum计算总和:
IntStream intNumbers = IntStream.range(0, 3);
assertEquals(3, intNumbers.sum());
我们可以对Double列表执行同样的操作。通过使用流,我们可以使用mapToDouble从对象流转换为DoubleStream:
List<Double> 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<Integer> intNumbers = Stream.of(5, 1, 100);
int result = intNumbers.reduce(0, Integer::sum);
assertEquals(106, result);
这适用于任何可以逻辑相加的东西,包括BigDecimal:
Stream<BigDecimal> bigDecimalNumber = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
BigDecimal result = bigDecimalNumber.reduce(BigDecimal.ZERO, BigDecimal::add);
assertEquals(11, result);
reduce方法有两个参数:
- Identity:相当于0-它是归约的起始值
- Accumulator函数:接收两个参数,到目前为止的结果和流的下一个元素
4. 总结
在本文中,我们研究了如何对数字流进行求和,然后我们介绍了如何使用reduce作为替代方法。
使用reduce允许我们对BigDecimal数字的集合求和,它可以应用于任何其他类型。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章