averagingdouble 计算分组平均值需嵌套在 groupingby 中作为下游收集器,支持单级/多级分组,空集合返回 nan,可通过过滤或 collectingandthen 处理,结合 summarizingdouble 可同时获取多种统计值。

用 averagingDouble 计算分组后的平均值,核心是先用 Collectors.groupingBy 分组,再嵌套使用 Collectors.averagingDouble 作为下游收集器。
基础写法:按字段分组并求平均值
假设有一个 Product 类,含 category(类别)和 price(价格),想计算每个类别的平均价格:
Map<string double> avgPriceByCategory = products.stream()
.collect(Collectors.groupingBy(
Product::getCategory,
Collectors.averagingDouble(Product::getPrice)
));</string>
结果是一个 Map<string double></string>,键是类别名,值是该类别下所有商品价格的平均值(自动处理空集合,返回 NaN)。
处理空组或避免 NaN
averagingDouble 对空集合返回 Double.NaN,实际中常需规避:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 确保分组前过滤掉无效数据:
.filter(p -> p.getPrice() != null && p.getPrice() > 0) - 用
Collectors.collectingAndThen后处理:Collectors.collectingAndThen(averagingDouble(...), d -> Double.isNaN(d) ? 0.0 : d) - 或改用自定义收集器(如先
toList再手动计算),但通常过滤更直接
多级分组 + 平均值
比如按“类别 + 是否促销”两级分组求平均价:
Map<string map double>> avgByCatAndSale = products.stream()
.collect(Collectors.groupingBy(
Product::getCategory,
Collectors.groupingBy(
Product::isOnSale,
Collectors.averagingDouble(Product::getPrice)
)
));</string>
得到的是嵌套 Map:category → {true=xx, false=yy},每层都用 averagingDouble 计算对应子集均值。
结合其他统计需求(如同时求平均和总数)
若还需计数、最大值等,不建议多个 groupingBy 链式调用,改用 Collectors.toMap 或自定义对象收集:
Map<string doublesummarystatistics> statsByCat = products.stream()
.collect(Collectors.groupingBy(
Product::getCategory,
Collectors.summarizingDouble(Product::getPrice)
));</string>
DoubleSummaryStatistics 包含 getAverage()、getCount()、getMax() 等,比单独用 averagingDouble 更高效。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










