Припустимо, у вас є такий код:
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
це примірник.