collectors.averagingdouble() 是 java stream api 中计算 double 平均值的收集器,支持空流返回 0.0、对象字段提取,但不处理 null/nan,精度有限,高精度场景需用 bigdecimal 或手动过滤归约。

Collectors.averagingDouble() 是 Java Stream API 中用于计算 double 类型平均值的收集器,它会自动处理空流(返回 0.0),也支持从对象中提取数值字段再求均值。
基本用法:直接对数字流求平均
适用于已知是 DoubleStream 或通过 mapToDouble() 转换后的场景:
List<double> numbers = Arrays.asList(1.5, 2.5, 3.0, 4.0);
double avg = numbers.stream()
.collect(Collectors.averagingDouble(Double::doubleValue));
System.out.println(avg); // 输出:2.75
</double>
注意:如果列表为空,结果为 0.0,不会抛异常。
从对象集合中提取字段再求平均
常见于实体类统计,比如商品价格、学生成绩等:
class Product {
private String name;
private double price;
// 构造器、getter 省略
}
List<product> products = Arrays.asList(
new Product("A", 19.9),
new Product("B", 29.9),
new Product("C", 9.9)
);
double avgPrice = products.stream()
.collect(Collectors.averagingDouble(Product::getPrice));
System.out.println(avgPrice); // 输出:19.9
</product>
注意事项和常见问题
- 输入必须是非 null 的
double值;若提取方法返回null(如用Double包装类型且字段为 null),会抛NullPointerException - 不支持跳过 null 值 —— 需提前过滤:
.filter(p -> p.getPrice() != null)或使用Optional安全提取 - 精度由
double本身决定,不适合高精度金融计算;如需精确控制,请改用BigDecimal手动累加再除 - 底层调用的是
DoubleSummaryStatistics,所以也可直接用它获取计数、总和、最大最小值等额外信息
替代方案:需要更灵活控制时
如果想跳过 NaN、无穷大或 null,或者自定义逻辑,建议手动归约:
OptionalDouble avg = list.stream()
.mapToDouble(Double::doubleValue)
.filter(d -> Double.isFinite(d)) // 过滤掉 NaN 和 Infinity
.average();
double result = avg.orElse(0.0);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











