查找 map 是否包含列表/可迭代中的任何键的有效方法

2022-09-02 11:07:13

我需要检查映射是否包含列表中的任何键,如果包含,则返回第一个匹配值。想到的天真的方法是在两个嵌套的循环中执行此操作:

Map<String, String> fields = new HashMap<String, String>();
fields.put("a", "value a");
fields.put("z", "value z");
String[] candidates = "a|b|c|d".split("|");
for (String key : fields.keySet()){
    for (String candidate : candidates) {
        if (key.equals(candidate)){
            return fields.get(key);
        }
    }
}

有没有一种更好,更有效的方法,可能是依赖Java标准库的方法?


答案 1
for(String candidate : candidates) {
 if(fields.containsKey(candidate)) {
  return fields.get(candidate)
 }
}

如果映射中可能存在空值,并且只需要第一个检测到的键,则最佳方法。


答案 2

当然是这样的:

for (String candidate : candidates) {
     String result = fields.get(key);
     if (result != null) {
         return result;
     }
}

上述操作仅对每个候选键执行一次映射查找。它避免了对存在和提取的单独测试,因为提取不存在的键只会给你一个空值。请注意(感谢 Slanec),对于此解决方案,有效密钥的 null 值与不存在的密钥无法区分。

我不太明白你为什么要执行案例转换,顺便说一句。