为什么将方法作为 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()
的主要目标是 检索 一个值。
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()
的主要目标是 检索 一个值。