当前位置: 首页 > 知识库问答 >
问题:

如何使用新的ComputeIfAstant函数?

公孙辰龙
2023-03-14

我非常想使用Map.ComputeifAstant,但自从本科时的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方式来表达它?

共有1个答案

毕富
2023-03-14

假设您有以下代码:

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();
    }
}

然后,您将看到消息正好为“snoop”创建一个值一次,因为在第二次调用ComputeIfAstent时,该键已经有一个值。lambda表达式k->f(k)中的k只是映射将传递给lambda以计算值的键的placeolder(参数)。因此在本例中,键被传递给函数调用。

或者,您也可以编写:wholetdogsout.computeifAstant(“snoop”,k->k.isempty());,以在不使用helper方法的情况下获得相同的结果(但您将看不到调试输出)。而且更简单,因为它是对您可以编写的现有方法的一个简单委派:wholetdogsout.computeiF缺席(“snoop”,string::isempty);此委派不需要编写任何参数。

为了更接近问题中的示例,您可以将其写成wholetdogsout.ComputeIFEstant(“snoop”,key->tryToLetOut(key));(将参数命名为kkey)。或者将其写成WholetDogsOut.ComputeIFEstant(“snoop”,MyClass::TryToLetout);如果TryToLetout静态或者WholetDogsOut.ComputeIFEstant(“snoop”,this::TryToLetout);如果TryToLetout实例方法,则写成。

 类似资料:
  • 问题内容: 我非常想使用Map.computeIfAbsent,但是自从lambdas进入本科以来已经太久了。 几乎 直接来自文档:它给出了做事的旧方法的示例: 和新方法: 但是在他们的示例中,我认为我不太“了解”。我将如何转换代码以使用新的lambda表达方式? 问题答案: 假设您有以下代码: 然后,您将看到消息恰好一次,就像在第二次调用时已经存在该键的值一样。的在λ表达式仅仅是该地图将传递到您

  • 我正在尝试使用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: 但是,这确实引发了一个问题,即当可以从查询中获取信息时,为什么要使用计算值来更新表。

  • 我正在使用< code>Azure Function v2。下面是我使用构造函数注入的函数: 我在从派生的Startup类中声明了我要注入Azure函数的所有依赖项: Azure函数调用其他依赖于ILogger的注入服务,例如< code > iaccountworf : 问题在于DI找不到任何<code>ILogger 问题 如何在< code>IWebJobsStartup中设置< code>