मान लें कि आपके पास निम्नलिखित कोड है:
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
एक उदाहरण विधि है।