collectors.summarizingdouble可一步生成含计数、总和、最小值、最大值和均值的doublesummarystatistics对象,线程安全且避免重复遍历;空流时min为positive_infinity、max为negative_infinity、average为nan。

使用 Collectors.summarizingDouble 可以一步生成包含计数、总和、最小值、最大值和均值的统计对象(DoubleSummaryStatistics),非常适合快速生成变量报表。它比手动计算总和与均值更简洁、线程安全,且避免重复遍历流。
获取基础统计信息
该收集器会返回一个 DoubleSummaryStatistics 实例,内建五项关键指标:
- count:非 null 元素个数
- sum:所有值之和(double 类型)
-
min:最小值(若无元素则为
Double.POSITIVE_INFINITY) -
max:最大值(若无元素则为
Double.NEGATIVE_INFINITY) -
average:均值(若无元素则为
Double.NaN)
典型用法示例
假设你有一组订单金额,想快速生成汇总报表:
<font color="#888">List<order> orders = Arrays.asList(
new Order("A", 120.5),
new Order("B", 89.0),
new Order("C", 210.75)
);</order></font>
DoubleSummaryStatistics stats = orders.stream()
.mapToDouble(Order::getAmount)
.collect(Collectors.summarizingDouble(d -> d));
System.out.println("总和:" + stats.getSum()); // 420.25
System.out.println("均值:" + stats.getAverage()); // 140.08333333333334
System.out.println("数量:" + stats.getCount()); // 3
System.out.println("最高:" + stats.getMax()); // 210.75
System.out.println("最低:" + stats.getMin()); // 89.0
整合进结构化报表输出
你可以将 DoubleSummaryStatistics 封装成易读的报表对象或 JSON 字段:
- 直接调用
toString()可得类似DoubleSummaryStatistics{count=3, sum=420.250000, min=89.000000, average=140.083333, max=210.750000}的字符串,适合日志或调试 - 自定义报表类时,可封装其各字段:
new Report(stats.getSum(), stats.getAverage(), stats.getCount()) - 配合
Gson或Jackson序列化时,需注意DoubleSummaryStatistics不是标准 Bean(无 getter 的 public 字段),建议转为 Map 或自定义 DTO
注意事项与避坑点
实际使用中需留意几个细节:
- 输入流为空时,
getAverage()返回NaN,打印或比较前建议先检查stats.getCount() > 0 - 若原始数据含
null值(如OptionalDouble或包装类型),需提前过滤,例如.filter(Objects::nonNull).mapToDouble(...) - 不支持加权均值;如需加权统计,需改用
Collectors.collectingAndThen配合自定义收集器 - 精度问题同 double 运算本身,对金融等高精度场景,应优先考虑
BigDecimal+ 手动累加










