如何使用新的computeIfAbsent函数?

我非常想使用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是实例方法。

以上是 如何使用新的computeIfAbsent函数? 的全部内容, 来源链接: utcz.com/qa/426992.html

回到顶部