用Stream.reduce(0.0, (sum,p)->sum+p.getPrice(), Double::sum)可安全简洁累加商品总价,三参数形式直接返回double、无需判空、线程安全;金融场景应改用BigDecimal.ZERO和BigDecimal::add避免精度误差。

直接用 Stream.reduce() 配合初始值(如 0.0)就能安全、简洁地累加商品总价,无需手动遍历或额外判空。
确保商品类有 getPrice() 方法
这是前提。比如商品类定义如下:
public class Product {
private String name;
private double price;
// 构造、getter 略
}
用 reduce(T identity, BinaryOperator) 形式
传入初始值(如 0.0)和累加逻辑,Stream 会自动处理空列表、单元素等边界情况:
-
identity:起始总金额,推荐用
0.0(double类型),避免自动装箱/拆箱问题 -
accumulator:用
(sum, p) -> sum + p.getPrice()或方法引用Double::sum
List
double total = products.stream()
.reduce(0.0, (sum, p) -> sum + p.getPrice(), Double::sum);
为什么用三参数 reduce 而不是两参数?
两参数 reduce(BinaryOperator) 返回 Optional,需额外调用 orElse(0.0) 处理空流;而三参数形式直接返回 double,语义更清晰、代码更简洁,且线程安全(适合并行流)。
注意精度问题(如需高精度)
若价格涉及金融计算,应改用 BigDecimal:
BigDecimal total = products.stream()
.reduce(BigDecimal.ZERO,
(sum, p) -> sum.add(p.getPrice()),
BigDecimal::add);
此时初始值用 BigDecimal.ZERO,累加逻辑也统一用 BigDecimal 运算,避免浮点误差。











