Предположим, у вас есть следующий код:
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)
просто подставка (параметр) для ключа, который карта передаст вашей лямбда-выражению для вычисления значения. Итак, в этом примере ключ передается при вызове функции.
В качестве альтернативы вы можете написать: 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
is static
или whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
if tryToLetOut
is a instance method.