使用Java流将双精度映射汇总为聚合的BigDecimal

hot*_*oup 3 java sum bigdecimal java-8 java-stream

我正在尝试使用Java 8 Stream API mapToDouble方法,如下所示:

BigDecimal totalCost = order.getOrderlineList().stream()
    .mapToDouble(Orderline::getPrice)
    .sum();
Run Code Online (Sandbox Code Playgroud)

问题是Orderline::getPrice返回a BigDecimal而不是a Double。因此,以上尝试无法编译(方法参考中的错误返回类型:无法将java.math.BigDecimal转换为doubele)。

看到那Orderline#price是a BigDecimal,我如何使用Stream API(mapToDouble或类似的东西)来获取我的totalCost

Sam*_*ipp 5

您应该BigDecimal使用添加,BigDecimal.add()而不是将它们转换为double并再次返回,以避免舍入错误。总结所有价格,您可以使用Stream.reduce()

BigDecimal bigDecimal = order.getOrderLines().stream()
        .map(OrderLine::getPrice)
        .reduce(BigDecimal.ZERO, BigDecimal::add);
Run Code Online (Sandbox Code Playgroud)

来自的文档Stream.reduce()

使用提供的标识值和关联累加函数对此流的元素执行归约,然后返回归约后的值。这等效于:

T result = identity;
for (T element : this stream)
    result = accumulator.apply(result, element)
return result;
Run Code Online (Sandbox Code Playgroud)

BigDecimal::add是的简写形式(a, b) -> a.add(b),它只是返回a + b。另外,标识元素为0BigDecimal.ZERO