为什么将方法作为 getOrDefault 的参数,无论如何都会调用该方法?

Why putting method as param of getOrDefault, the method will be invoked anyway?

Map<String, Integer> iMap = new HashMap<>();
iMap.put("a", 1);
Integer a = iMap.getOrDefault("a", getNum());

private Integer getNum() {
    System.out.println("getNum Method has been invoked");
    return 123;
}

output: getNum Method has been invoked

iMap 有键“a”,为什么 getNum 仍然被调用?

方法 getOrDefault() 在 执行其逻辑之前 评估两个参数。

如果你想提供一个可选的部分来延迟计算,那么你需要 Java-8 方法,比如 merge()computeIfAbsent().

Map<String, Integer> iMap = new HashMap<>();
iMap.put("a", 1);
Integer a = iMap.computeIfAbsent("a", key -> getNum());

由于映射中存在键“a”,因此不会执行 lambda 表达式。

注:

  • computeIfAbsent() 不是 getOrDefault() 的统一替代。这些方法旨在表示地图上的不同操作。从本质上讲,computeIfAbsent() 更接近于 put()putIfAbsent() 而不是 getOrDefault()computeIfAbsent() 的主要目标是 在地图中进行更改 ,而 getOrDefault() 的主要目标是 检索 一个值。