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
相关产品推荐
相关产品推荐

