登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  java教程

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对应状态合并关系,不是运行步骤或实测结果。

把重复计入和共享修改挡在合并前

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进总对象。

合并后能撤回某一片吗?

这个接口没有对应的减去分片操作。需要撤回或纠错时,保留有效分片记录并重建总统计,尤其不要简单相减后猜测最小值和最大值。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>