Załóżmy, że masz następujący kod:
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();
}
}
Wtedy zobaczysz wiadomość creating a value for "snoop"
dokładnie raz, ponieważ przy drugim wywołaniu computeIfAbsent
jest już wartość dla tego klucza. W k
wyrażeniu lambda k -> f(k)
jest po prostu miejscem (parametr) dla klucza, który mapa przekaże do twojej lambdy w celu obliczenia wartości. W tym przykładzie klucz jest przekazywany do wywołania funkcji.
Alternatywnie możesz napisać: whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());
aby osiągnąć ten sam wynik bez metody pomocniczej (ale wtedy nie zobaczysz wyniku debugowania). A nawet prostsze, ponieważ jest to prosta delegacja do istniejącej metody, którą można napisać: whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);
Ta delegacja nie wymaga zapisywania żadnych parametrów.
Aby być bliżej przykładu w swoim pytaniu, możesz zapisać go jako whoLetDogsOut.computeIfAbsent("snoop", key -> tryToLetOut(key));
(nie ma znaczenia, czy nazwiesz parametr, k
czy key
). Lub napisz to tak, whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);
jakby tryToLetOut
było static
lub whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
jeśli tryToLetOut
jest metodą instancji.