Giả sử bạn có mã sau:
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();
}
}
Sau đó, bạn sẽ thấy thông báo creating a value for "snoop"
chính xác một lần như trong lần gọi thứ hai computeIfAbsent
là đã có một giá trị cho khóa đó. Trong k
biểu thức lambda k -> f(k)
chỉ là một bộ định vị (tham số) cho khóa mà bản đồ sẽ chuyển đến lambda của bạn để tính toán giá trị. Vì vậy, trong ví dụ, khóa được chuyển cho lệnh gọi hàm.
Ngoài ra, bạn có thể viết: whoLetDogsOut.computeIfAbsent("snoop", k -> k.isEmpty());
để đạt được kết quả tương tự mà không cần phương thức trợ giúp (nhưng bạn sẽ không thấy đầu ra gỡ lỗi sau đó). Và đơn giản hơn nữa, vì nó là một ủy quyền đơn giản cho một phương thức hiện có mà bạn có thể viết: whoLetDogsOut.computeIfAbsent("snoop", String::isEmpty);
Sự ủy quyền này không cần bất kỳ tham số nào được viết.
Để gần với ví dụ trong câu hỏi của bạn hơn, bạn có thể viết nó là whoLetDogsOut.computeIfAbsent("snoop", key -> tryToLetOut(key));
(không quan trọng bạn đặt tên cho tham số k
hay key
). Hoặc viết nó như whoLetDogsOut.computeIfAbsent("snoop", MyClass::tryToLetOut);
thể tryToLetOut
là static
hoặc whoLetDogsOut.computeIfAbsent("snoop", this::tryToLetOut);
nếu tryToLetOut
là một phương thức thể hiện.