collectors.summarizingdouble()可一步获取均值、最大值、最小值、总和和元素个数,返回doublesummarystatistics对象,适用于stream,需传入todoublefunction提取数值,空流时getaverage()返回nan、getmax()/getmin()返回无穷大,需判空处理。

直接用 Collectors.summarizingDouble() 就能一步拿到均值(average)、最大值(max)、最小值(min)、总和(sum)和元素个数(count),无需多次遍历流。
使用 summarizingDouble 获取统计结果
该收集器返回一个 DoubleSummaryStatistics 对象,它内部已预计算好全部基础统计量。你只需传入一个 ToDoubleFunction 来提取数值字段:
- 适用于
Stream<t></t>,比如List<product></product>或Stream<double></double> - 提取逻辑写在 lambda 中,例如
p -> p.getPrice() - 结果对象提供
getAverage()、getMax()、getSum()等方法,返回double类型(空流时getMax()和getMin()返回Double.NEGATIVE_INFINITY和Double.POSITIVE_INFINITY,需注意判空)
完整示例代码
假设有商品列表,想统计价格的均值、最大值和总和:
import java.util.*;
import java.util.stream.Collectors;
class Product {
private String name;
private double price;
Product(String name, double price) {
this.name = name;
this.price = price;
}
double getPrice() { return price; }
}
// 使用示例
List<product> products = Arrays.asList(
new Product("A", 19.9),
new Product("B", 25.5),
new Product("C", 12.0)
);
DoubleSummaryStatistics stats = products.stream()
.collect(Collectors.summarizingDouble(Product::getPrice));
System.out.println("平均值: " + stats.getAverage()); // ~19.13
System.out.println("最大值: " + stats.getMax()); // 25.5
System.out.println("总和: " + stats.getSum()); // 57.4
System.out.println("数量: " + stats.getCount()); // 3
</product>
注意事项与常见问题
这个方法高效且简洁,但要注意几个细节:
- 空流不会抛异常,但
getAverage()返回Double.NaN,建议用stats.getCount() > 0判断是否有效 - 不支持自定义精度或四舍五入,如需保留两位小数,需手动格式化输出(如
String.format("%.2f", stats.getAverage())) - 如果还需标准差或中位数等高级统计量,
DoubleSummaryStatistics不提供,得换用第三方库(如 Apache Commons Math)或手写逻辑
替代方案对比(仅当需要更灵活控制时)
如果只要均值和总和,不用最大值,用 Collectors.averagingDouble() 或 Collectors.summingDouble() 更轻量;但只要三项都需,summarizingDouble 是最优解——一次遍历,五项全出,无额外开销。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











