Java DoubleSummaryStatistics 怎样合并分片统计结果
来源:17golang原创
时间:2026-10-29 17:49:09 194浏览 收藏
Java DoubleSummaryStatistics通过total.combine(part)把分片状态累积到total。先为每片创建独立统计对象,再创建一个空的总对象,按片各合并一次,最后读取总count、sum、min、max和average。combine修改接收者,返回void,不能把它当成返回新统计对象的函数。
官方地址:https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/DoubleSummaryStatistics.html
先保护统计口径和分片身份
假设一组指标被拆成两片,一片两项、一片一项。合并要保护的首先是统计正确性:每条样本只属于一个分片,各片使用相同单位与过滤规则,同一分片只计入一次。本文借用风险分析的顺序讨论这些问题,不把普通数值聚合误说成存在某个已知安全漏洞。
| 风险 | 后果 | 处理责任 |
|---|---|---|
| 重复分片 | 计数和总和重复累积 | 业务接收层记录分片身份 |
| 直接平均片均值 | 忽略片大小 | 保留统计对象整体合并 |
| 并发写同一对象 | 共享可变状态竞争 | 分片隔离,汇总串行 |
用独立总对象逐片合并
以下完整Java示例使用互不重叠的数据,并把有限数作为业务输入约定。代码未在本文环境运行,没有实测输出。
import java.util.DoubleSummaryStatistics;
public class ShardStatistics {
static DoubleSummaryStatistics summarize(double[] values) {
DoubleSummaryStatistics stats = new DoubleSummaryStatistics();
for (double value : values) {
// 示例业务只接受有限值,拒绝策略在分片阶段统一
if (!Double.isFinite(value)) {
throw new IllegalArgumentException("统计值必须为有限数");
}
stats.accept(value);
}
return stats;
}
public static void main(String[] args) {
DoubleSummaryStatistics first = summarize(new double[]{2.0, 4.0});
DoubleSummaryStatistics second = summarize(new double[]{9.0});
// 独立总对象,避免把某个分片本身当作累计结果
DoubleSummaryStatistics total = new DoubleSummaryStatistics();
total.combine(first);
total.combine(second);
// 读取总统计字段;示例未在本文环境执行
System.out.println("count=" + total.getCount());
System.out.println("sum=" + total.getSum());
System.out.println("average=" + total.getAverage());
System.out.println("min=" + total.getMin());
System.out.println("max=" + total.getMax());
}
}从示例数据直接计算,count应为3、sum为15、min为2、max为9、average为5。两个片均值分别为3和9,若直接相加再除以2则是6,这不是所有样本的平均值。保留片统计对象,可以避免自行拼凑不完整汇总信息。

把重复计入和共享修改挡在合并前
combine只接收另一个统计对象,没有分片ID参数。它不负责判断该片是否已经处理,重复调用不会自动变成幂等操作。接收层应以任务ID、分片ID和数据范围识别重复;重试不能不加区分地再次累积。
示例在同一线程内汇总已经完成的片。官方说明该类不是线程安全的;并行流的收集可以依靠框架提供的分区、隔离和合并机制,但这不意味着多个自建线程可以共同accept或combine同一个实例。合并期间也不要让生产者继续修改源分片。官方线程与combine契约
不要把total设为first后又遍历全部分片,把first再次加进去。独立空总对象让“哪些片已经加入”更容易理解,也避免调用方误以为first仍只是原片统计。
处理空片和非有限数值
默认构造得到空统计对象,读取前应以count判断是否有样本。空片不应被解释成“观察到一个零值”;展示层也不应只依据average判断有没有数据。NaN和无穷值需要明确业务策略,示例选择拒绝,而不是静默过滤造成片间口径不一致。
double加法受运算顺序与舍入影响,分片组织和合并顺序可能影响末位精度。不能把数学上可合并推导为任意分组逐位相同,也不应用这类统计结果替代需要十进制精确计算的业务模型。

留下可定位的分片记录
汇总层可记录任务标识、分片标识、样本数量、过滤策略及是否已计入。重算时从片记录重建总对象,比在不明确已累积内容的旧对象上补加更容易解释。记录数据来源不等于记录全部原始敏感数值,字段应按实际需要选择。
- 分片范围不重叠,单位和输入策略相同。
- 每片完成后才交给汇总层。
- 每片只combine一次,总对象不复用为某一原片。
- 以count判断空结果,并为浮点误差定义业务容忍范围。
可以把combine结果赋给total吗?
不可以,返回类型为void。先创建total,再调用其combine方法。
只保存count和average够吗?
不能据此完整恢复最小值、最大值等信息。需要分片统计时应保留所需字段与输入口径,不要把片均值当成一个普通样本accept进总对象。
合并后能撤回某一片吗?
这个接口没有对应的减去分片操作。需要撤回或纠错时,保留有效分片记录并重建总统计,尤其不要简单相减后猜测最小值和最大值。
-
501 收藏
-
文章 · java教程 | 1个月前 | Java · 异常处理 · 资源管理 · java try-with-resources AutoCloseable close suppressed exception501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
339 收藏
-
203 收藏
-
159 收藏
-
150 收藏
-
464 收藏
-
254 收藏
-
351 收藏
-
321 收藏
-
137 收藏
-
229 收藏
-
496 收藏
-
401 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习