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()
的统一替代。这些方法旨在表示 map 上的不同操作。就其本质而言,computeIfAbsent()
更接近put()
或putIfAbsent()
,而不是getOrDefault()
>。computeIfAbsent()
的主要目标是在 map 中进行更改,而getOrDefault()
的主要目标是检索一个值。
关于java - 为什么将方法作为 getOrDefault 的参数,该方法无论如何都会被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71274031/