当前位置: 首页 > 面试题库 >

如何使用新的computeIfAbsent函数?

弘阳德
2023-03-14
问题内容

我非常想使用Map.computeIfAbsent,但是自从lambdas进入本科以来已经太久了。

几乎 直接来自文档:它给出了做事的旧方法的示例:

Map<String, Boolean> whoLetDogsOut = new ConcurrentHashMap<>();
String key = "snoop";
if (whoLetDogsOut.get(key) == null) {
  Boolean isLetOut = tryToLetOut(key);
  if (isLetOut != null)
    map.putIfAbsent(key, isLetOut);
}

和新方法:

map.computeIfAbsent(key, k -> new Value(f(k)));

但是在他们的示例中,我认为我不太“了解”。我将如何转换代码以使用新的lambda表达方式?


问题答案:

假设您有以下代码:

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class Test {
    public static void main(String[] s) {
        Map<String, Boolean> whoLetDogsOut = new ConcurrentHashMap<>();
        whoLetDogsOut.computeIfAbsent("snoop", k -> f(k));
        whoLetDogsOut.computeIfAbsent("snoop", k -> f(k));
    }
    static boolean f(String s) {
        System.out.println("creating a value for \""+s+'"');
        return s.isEmpty();
    }
}

然后,您将看到消息creating a value for "snoop"恰好一次,就像在第二次调用时computeIfAbsent已经存在该键的值一样。的k在λ表达式k -> f(k)仅仅是该地图将传递到您的拉姆达用于计算值的键一个placeolder(参数)。因此,在示例中,键被传递给函数调用。

或者,您可以编写:whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());在没有辅助方法的情况下获得相同的结果(但是您将看不到调试输出)。甚至更简单,因为它是对现有方法的简单委托,因此您可以编写:whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);此委托不需要编写任何参数。

为了更接近问题中的示例,您可以将其编写为whoLetDogsOut.computeIfAbsent("snoop", key -> tryToLetOut(key));(命名参数k还是都没有关系key)。或将其编写为whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);好像tryToLetOutstaticwhoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);如果tryToLetOut是实例方法。



 类似资料:
  • 我非常想使用Map.ComputeifAstant,但自从本科时的lambdas已经太久了。 几乎直接来自文档:它给出了一个古老的做事方式的例子: 又新道: 但在他们的例子中,我认为我还没有完全“明白”。我将如何转换代码以使用新的lambda方式来表达它?

  • 问题内容: Java 8中引入了一个新的computeIfAbsent API。ConcurrentHashMap 实现它的javadocs 状态如下: 如果指定的键尚未与值关联,则尝试使用给定的映射函数计算其值,除非为null,否则将其输入此映射。整个方法调用是原子执行的,因此每个键最多可应用一次该功能。在进行计算时,可能会阻止其他线程在此映射上进行的某些尝试的更新操作,因此计算应简短而简单,并

  • 我正在尝试使用CloudFormation创建Lambda函数的新版本。 我想拥有同一个Lambda函数的多个版本,这样我就可以(a)在不同的版本中指向别名——比如DEV和PROD——并且(b)能够回滚到更早的版本 这是我的Lambda版本的定义: 运行“aws cloudformation创建堆栈”时会创建一个版本,但后续的“aws cloudformation更新堆栈”命令不会执行任何操作。没

  • 我有多个云函数使用一个值,基本上是这样的: 问题是我想要更改页脚内容(由返回),但为了这样做(就我所研究的),我首先必须在代码中更改它,然后部署使用的每个云函数(和),这样页脚在每种类型的电子邮件上看起来都是一样的。 当然,我可以使用同时部署所有函数,但是我们曾经是多个开发人员,我们中的一些人将函数更新到我们不知道index.js中哪些函数与GCP中的相同(大约20个函数),我必须检查每一个函数,

  • 我正在尝试使用reactjs通过调用axios创建用户配置文件。但我只能在使用Effect时看到更新的状态,而在其他地方看不到。在loginPage中。js,我正在尝试获取entryfirstName、entryLastName和role的最新状态,并将其发布到登录函数中,该函数将返回到我的userProvider.js中。我不知道如何更新状态,所以任何反馈都比我得到的要好。 我是新手反应,我无法

  • 问题内容: 这是我使用的代码 我试图在客户表中的TotalP字段中设置一个值x。值x等于“产品”表中“客户ID”相同的对应价格的总和。 上面的代码返回错误 问题答案: 您可以使用DSum: 但是,这确实引发了一个问题,即当可以从查询中获取信息时,为什么要使用计算值来更新表。