假设您有以下代码:
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
lambda 表达式中的k -> f(k)
只是映射将传递给您的 lambda 以计算值的键的占位符(参数)。因此,在示例中,密钥被传递给函数调用。
或者,您可以编写:whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());
在没有辅助方法的情况下实现相同的结果(但您不会看到调试输出)。甚至更简单,因为它是对现有方法的简单委托,您可以编写:whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);
此委托不需要编写任何参数。
为了更接近您问题中的示例,您可以将其写为whoLetDogsOut.computeIfAbsent("snoop", key -> tryToLetOut(key));
(无论您命名参数k
还是key
)。或者把它写成whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);
if tryToLetOut
isstatic
或者whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
if tryToLetOut
is 一个实例方法。