
假设您有以下代码:
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);好像tryToLetOut是
static或
whoLetDogsOut.computeIfAbsent("snoop",this::tryToLetOut);如果tryToLetOut是实例方法。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)