【问题标题】:Reimplement the Double Brace Initialization of the HashMap [duplicate]重新实现HashMap的双括号初始化[重复]
【发布时间】:2022-08-17 23:27:13
【问题描述】:

我有一个枚举AuditType

还有一个映射Map<String, String>(类字段)需要通过迭代AuditType常量来初始化并根据如果别的健康)状况。

它已使用复杂的双括号初始化 (我实际上并没有写过这段代码)。

现在我正在尝试修复声纳的覆盖范围,因为它抱怨我需要使用另一种方式来初始化此地图。

代码:

Map<String, String> TYPES = new HashMap<String, String>() {
    {
        Stream.of(AuditType.values()).forEach(auditType -> {
            if (AuditType.ACCOUNT_RECORD.equals(auditType)) {
                put(AuditCodes.Type.ACCOUNT_ACTIVITY.getCode(), auditType.name());
            } else {
                String ssCode = AuditCodes.Type.valueOf(auditType.name()).getCode();
                put(ssCode, auditType.name());
            }
        });
    }
};

有没有办法在没有双括号初始化的情况下编写它?

  • 这是一个字段声明吗?还是它在方法内部的某个地方?
  • 抱歉纠正了@AlexanderIvanchenko 的错字。是的 AuditType 是一个枚举。
  • 这是在@DawoodibnKareem 方法中
  • @AlexanderIvanchenko - 我实际上并没有编写此代码,我正在尝试修复声纳覆盖范围,因为它会抱怨 -> 使用另一种方式来初始化此实例。但我相信它会创建一个新的哈希图并遍历枚举并基于 if else 条件尝试将这些值放入映射中。
  • 我的错,再次检查,它是一个字段声明

标签: java hashmap java-stream anonymous-class


【解决方案1】:

您可以在枚举常量上创建一个流并通过传递应用collect()集电极toMap()) 作为参数。

这种toMap() 的风格需要树参数:

  • keyMapper – 负责生成的函数钥匙,
  • valueMapper – 负责生产的函数价值观,
  • mergeFunction - 一个用于解决重复的函数。

表示关于地图的条件逻辑钥匙,您可以在 a 中使用三元运算符键映射器功能。

因为AuditType枚举,您可以使用身份比较== 而不是equals()

Map<String, String> TYPES = Arrays.stream(AuditType.values())
    .collect(Collectors.toMap(
        auditType -> AuditType.ACCOUNT_RECORD == auditType ? 
            AuditCodes.Type.ACCOUNT_ACTIVITY.getCode() : AuditCodes.Type.valueOf(auditType.name()).getCode(),
        AuditType::name,
        (v1, v2) -> v2 // map the duplicated key to the latest value
    ));

【讨论】:

  • 不幸的是,一些测试用例因错误而失败 -> Exception java.lang.IllegalStateException: Duplicate key 110100 (attempted merging values ACCOUNT_RECORD and ACCOUNT_ACTIVITY)
  • @PassionateAbtCoding 这意味着原始代码也不应该正常工作-它会默默地覆盖该值。为了让这段代码表现得像原来的一样,我们可以添加第三个参数来解析重复,保留最新的值。我会在一分钟内展示它。
  • 最新修复修复了重复错误。
  • @PassionateAbtCoding getCode() 返回的代码一致并且地图值被覆盖,这很可疑。我建议对此进行调查。
【解决方案2】:

这里可以做很多简化。

private static final Map<String, String> auditTypeByCode = auditTypeByCodeMap();

private static Map<String, String> auditTypeByCodeMap() {
  Map<String, String> index = new HashMap<>();
  for (AuditType auditType : AuditType.values()) {
    String val = auditType.name();
    AuditCodes.Type key = (auditType == AuditType.ACCOUNT_RECORD)
      ? AuditCodes.Type.ACCOUNT_ACTIVITY
      : AuditCodes.Type.valueOf(val);
    index.put(key.getCode(), val);
  }
  return index;
}

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 2015-05-12
    • 2014-07-17
    • 2017-07-24
    • 1970-01-01
    • 2019-02-09
    • 2012-08-28
    • 2021-07-14
    相关资源
    最近更新 更多