Java Map - 在 getOrDefault 中找不到密钥时的日志消息

her*_*arn 4 java hashmap

我有一个Map<String, List<SomeClass>> someMap,我正在根据someKey我正在执行其他操作的 SomeClass 列表中的每个元素检索值。

someMap.getOrDefault(someKey, new ArrayList<>()).forEach(...)
Run Code Online (Sandbox Code Playgroud)

我还希望能够在找不到someKey. 我如何才能以最佳方式实现它?有没有其他功能/方法可以实现这种行为?

Har*_*ekh 6

Map<String, List<String>> map = new HashMap<>();
List<String> l = new ArrayList<>();
l.add("b");
map.put("a", l);
Run Code Online (Sandbox Code Playgroud)

是的,您可以在一个语句中完成。使用.compute().

map.compute("a", (k, v) -> {
    if (v == null) {
        System.out.println("Key Not Found");
        return new ArrayList<>();
    }
    return v;
}).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

还有computeIfAbsent()它如果该键不存在,只计算拉姆达。


请注意,来自文档:

尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为 null)。

这将添加在您的地图中未找到的密钥。

如果您想稍后删除这些键,只需将这些键添加到 if 内的列表中,并在如下语句中删除它们:

map.keySet().removeAll(listToRemove);
Run Code Online (Sandbox Code Playgroud)

  • 对于大多数不可变映射,“compute...”方法将无条件抛出异常,即使键存在。这是与“getOrDefault”的根本区别。此外,收集缺失的密钥并在以后删除它们,会使复杂的解决方案变得更加复杂。与直接的 `List&lt;String&gt; list = map.get(key); 进行比较 if(list == null) System.out.println("未找到密钥"); else list.forEach(action);` 这不仅更简单,而且避免了不必要的创建虚拟 `ArrayList`。 (2认同)