Misalkan Anda memiliki kode berikut:
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();
}
}
Kemudian Anda akan melihat pesan creating a value for "snoop"
tepat satu kali karena pada pemanggilan kedua computeIfAbsent
sudah ada nilai untuk kunci itu. Dalam k
ekspresi lambdak -> f(k)
hanya placeolder (parameter) untuk kunci yang peta akan lolos ke lambda Anda untuk menghitung nilai. Jadi dalam contoh, kunci dilewatkan ke pemanggilan fungsi.
Atau Anda dapat menulis: whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());
untuk mencapai hasil yang sama tanpa metode helper (tetapi Anda tidak akan melihat keluaran debugging saat itu). Dan bahkan lebih sederhana, karena ini adalah pendelegasian sederhana ke metode yang sudah ada, Anda dapat menulis: whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);
Delegasi ini tidak memerlukan parameter apa pun untuk ditulis.
Untuk lebih mendekati contoh dalam pertanyaan Anda, Anda dapat menuliskannya sebagai whoLetDogsOut.computeIfAbsent("snoop", key -> tryToLetOut(key));
(tidak masalah apakah Anda menamai parameter k
atau key
). Atau menulis sebagai whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);
jika tryToLetOut
adalah static
atau whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
jika tryToLetOut
merupakan metode contoh.