我们通常使用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());
我们可以从 Double s的列表开始执行类似的操作。通过使用streams,我们可以使用 mapToDouble 将对象流转换为 Double stream :
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。所以,我们需要另一个解决方案。
我们使用 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 方法有两个参数:
本文中,我们研究了如何在数字 流 中计算数字之和。以及如何使用 reduce 作为替代。