【问题标题】:Why putting method as param of getOrDefault, the method will be invoked anyway? [duplicate]为什么将方法作为 getOrDefault 的参数,无论如何都会调用该方法? [复制]
【发布时间】:2022-03-11 05:46:15
【问题描述】:
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 仍然被调用?

【问题讨论】:

  • 这是一个有限的设计,因为 Java 没有惰性求值。仅当参数是文字值时才使用该方法。您可以编写自己的 getOrDefault(T,Supplier) 或使用第 3 方库。如果您还想同时更新值,请使用computeIfAbsent

标签: java java-8


【解决方案1】:

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

【讨论】:

  • 但请记住,computeIfAbsent 将修改地图,而getOrDefault 则相反。
  • @Holger 是的,这只是一种模糊的相似性,这两种方法是为了在地图上表示不同的操作。从本质上讲,computeIfAbsent() 更接近于put(),而不是getOrDefault()。我想这在答案中值得一提,尽管这个问题的命运要被删除。
  • 重复并不一定意味着删除问题。您可以将computeIfAbsentputIfAbsent 进行比较,但遗憾的是它们的返回值不同。
猜你喜欢
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2020-07-03
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
相关资源
最近更新 更多