Aşağıdaki koda sahip olduğunuzu varsayalım:
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();
}
}
O zaman mesajı creating a value for "snoop"
tam olarak bir kez göreceksiniz, ikinci çağrıda computeIfAbsent
olduğu gibi o anahtar için zaten bir değer var. k
Lambda ekspresyonundak -> f(k)
sadece harita değerinin hesaplanması için lambda geçecek anahtar için bir placeolder (parametresi). Dolayısıyla, örnekte anahtar işlev çağrısına aktarılır.
Alternatif olarak whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());
, aynı sonucu bir yardımcı yöntem olmadan elde etmek için yazabilirsiniz (ancak o zaman hata ayıklama çıktısını göremezsiniz). Ve daha da basit, çünkü yazabileceğiniz mevcut bir yönteme basit bir yetkilendirme: whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);
Bu delegasyonun yazılacak herhangi bir parametreye ihtiyacı yoktur.
Sorunuzdaki örneğe daha yakın olmak için, bunu şu şekilde yazabilirsiniz whoLetDogsOut.computeIfAbsent("snoop", key -> tryToLetOut(key));
(parametrenin adını k
veya adını vermenizin önemi yoktur key
). Veya olarak yazmak whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);
eğer tryToLetOut
olduğunu static
ya whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
eğer tryToLetOut
bir örnek yöntemidir.