Предположим, у вас есть следующий код:
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 tryToLetOutis staticили whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);if tryToLetOutis a instance method.