collectors.averagingdouble是java stream api中用于计算double类型平均值的内置收集器,支持直接数值流或从对象提取字段(如product::getprice),空流返回0.0,但不处理null元素,需提前过滤;另有averagingint和averaginglong对应整型字段。

在 Java 中,Collectors.averagingDouble 是 Stream API 提供的内置收集器,专门用于对 double 类型数值求平均值。它会自动处理空流(返回 0.0),也支持从对象中提取数值字段再计算。
基本用法:直接对 double 流求平均
如果你有一个 DoubleStream 或能映射为 double 的流,可以直接使用:
List<double> numbers = Arrays.asList(1.5, 2.5, 3.0, 4.0);
double avg = numbers.stream()
.collect(Collectors.averagingDouble(Double::doubleValue));
// 结果:2.75
</double>
从对象列表中提取字段求平均
常见场景是统计对象某个 double 或可转为 double 的字段(如 int、long):
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));
// 结果:19.9
</product>
- 注意:方法引用
Product::getPrice必须返回double、Double、或能自动拆箱/提升的类型(如int→double) - 如果字段是
Integer或Long,也会被隐式转换为double
处理空集合或 null 值的注意事项
averagingDouble 对空流返回 0.0,但不会自动跳过 null 元素 —— 如果映射函数返回 null(比如 Product::getPrice 返回 null),运行时会抛 NullPointerException:
- 安全做法:提前过滤掉 null 对象或 null 字段
- 例如:
.filter(Objects::nonNull).filter(p -> p.getPrice() != null) - 或者用
mapToDouble+OptionalDouble手动控制(更灵活但稍复杂)
与其他 averaging 收集器对比
除了 averagingDouble,还有:
-
Collectors.averagingInt:适用于int字段,返回double -
Collectors.averagingLong:适用于long字段,返回double
三者行为一致,只是输入类型不同;内部都使用 double 累加和计数,最终返回 double 类型平均值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











