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

标签 java java-8

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/

相关文章:

Java 8 兼容性问题 : How to convert Object array to Subtype List in Java 8?

collections - 使用 next() 和 get() 从对象迭代

java - 如何使用 Spring Data 在代码中使用自动生成的 ID?

java - 从 Eclipse RCP 应用程序制作 jar

java - 我在 java 中的构造函数有什么问题?

java - 如何使用 liferay 获取 AssetEntry 的网页内容?

java - 你如何从 Java 调用 Scala 对象?

java - Java ThreadPoolExecutor [提交的内容超过MaxPoolSize]

java - 是否存在表示 instanceof 运算符的现有 Predicate?

java - 什么时候应该在 Java 中使用 IntStream.range?