Angenommen, Sie haben den folgenden Code:
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();
}
}
Dann sehen Sie die Nachricht creating a value for "snoop"
genau einmal, da beim zweiten Aufruf von computeIfAbsent
bereits ein Wert für diesen Schlüssel vorhanden ist. Der k
Ausdruck im Lambda k -> f(k)
ist nur ein Platzhalter (Parameter) für den Schlüssel, den die Karte zur Berechnung des Werts an Ihr Lambda übergibt. Im Beispiel wird der Schlüssel also an den Funktionsaufruf übergeben.
Alternativ könnten Sie schreiben: whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());
um das gleiche Ergebnis ohne eine Hilfsmethode zu erzielen (aber die Debugging-Ausgabe wird dann nicht angezeigt). Und noch einfacher, da es sich um eine einfache Delegierung an eine vorhandene Methode handelt, die Sie schreiben könnten: Für whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);
diese Delegierung müssen keine Parameter geschrieben werden.
Um näher an dem Beispiel in Ihrer Frage zu sein, können Sie es als schreiben whoLetDogsOut.computeIfAbsent("snoop", key -> tryToLetOut(key));
(es spielt keine Rolle, ob Sie den Parameter benennen k
oder key
). Oder schreiben Sie es als whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);
ob tryToLetOut
ist static
oder whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
wenn tryToLetOut
eine Instanz - Methode.