สมมติว่าคุณมีรหัสต่อไปนี้:
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
เป็นวิธีการอินสแตนซ์