如果key存在且value不为null则放入map中,否则抛出异常

Har*_*ekh 3 java hashmap java-8

void addToMapIfKeyExists(String k, String v) {
    if (!map.containsKey(k)) {
        throw new NoSuchElementException(k + " does not exist in the map");
    }

    // else ignore
    if (v != null) {
        map.put(k, v);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以在 Java 8 中以更好的方式编写这个吗?我可以通过某种方式将其合并为一个表达式吗?

rzw*_*oot 6

您可以在一个声明中:

public void overwrite(String k, String v) {
    map.compute(k, (key, value) -> {
        if (value == null) throw new NoSuchElementException(key + " does not exist in the map");
        return v == null ? value : v;
    });
}
Run Code Online (Sandbox Code Playgroud)

上面的做法是:

[1] 如果 key 不在映射中,或者映射为 null,则抛出NoSuchElementException。

[2] 否则,如果您尝试设置 ,则不会执行任何操作null。

[3] 否则,会将键设置为新值

这显然是您想要的,但这是一个奇怪的需求组合。

  • 普通的“HashMap”不保证原子性,但单个“compute”仍然比“containsKey”后跟“put”更有效,因为它只承担单个哈希查找。您还可以使用 if(map.compute(k, (key, value) -> v == null ? value : v) == null) throw new NoSuchElementException(key + " 地图中不存在");` ; 此变体也适用于“computeIfPresent”。 (2认同)