You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现枚举键Map<String,Integer>默认0值计数的替代写法咨询

方案1:改用EnumMap实现(性能最优,枚举场景首选)

EnumMap是JDK专门为枚举类型设计的Map实现,内存占用和访问效率都远高于HashMap,适配你的场景:
如果可以调整Map的泛型为枚举类型,简化后续调用:

// 初始化
private Map<MyEnum, Integer> output = new EnumMap<>(MyEnum.class);
static {
    for (MyEnum e : MyEnum.values()) {
        output.put(e, 0);
    }
}

// 统计时直接传枚举实例,无需取code
output.merge(yourEnumInstance, 1, Integer::sum);

如果必须保持Map<String, Integer>的类型不变,也可以指定用EnumMap作为底层实现:

private Map<String, Integer> output = Arrays.stream(MyEnum.values())
        .collect(Collectors.toMap(
            e -> e.code,
            e -> 0,
            (v1, v2) -> v1,
            () -> new EnumMap<>(MyEnum.class)
        ));

方案2:省略提前初始化步骤,最后补全默认值

Map.merge方法本身就支持不存在的key:如果key不存在,会直接把第二个参数作为初始值存入,不需要提前把所有key设为0,你可以改成统计完后统一补全未出现的枚举的默认值,代码更简洁:

// 仅初始化空Map即可
private Map<String, Integer> output = new HashMap<>();

// 统计逻辑不变,自动处理不存在的key
output.merge(myEnumCode, 1, Integer::sum);

// 最后需要输出/使用结果前,补全所有枚举的默认值0
for (MyEnum e : MyEnum.values()) {
    output.putIfAbsent(e.code, 0);
}

方案3:批量统计时直接用Stream生成结果

如果你是统计一批已知的枚举实例集合,不需要维护中间Map,可以一步生成符合要求的统计结果:

// 示例:待统计的枚举实例集合
List<MyEnum> toCountList = xxx;

// 一步生成包含所有枚举、默认值为0的统计Map
Map<String, Integer> output = Arrays.stream(MyEnum.values())
        .collect(Collectors.toMap(
            e -> e.code,
            e -> Collections.frequency(toCountList, e)
        ));

注意:你的示例代码中枚举类名前后不一致,定义时用的是MyEnum,初始化Map时用了MyEnumCode,实际编码时注意统一类名即可。

内容的提问来源于stack exchange,提问作者spring00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 19:45:05