1. कार्य विधियाँ

यदि किसी इंटरफ़ेस में केवल एक विधि है , तो उस इंटरफ़ेस प्रकार के एक चर को लैम्ब्डा एक्सप्रेशन (लैम्ब्डा फ़ंक्शन) द्वारा दिया गया मान असाइन किया जा सकता है। इस तरह के इंटरफेस को कार्यात्मक इंटरफेस के रूप में जाना जाता है (जावा द्वारा लैम्ब्डा कार्यों के लिए समर्थन जोड़ा जाने के बाद)।

उदाहरण के लिए, जावा में Consumer<Type>इंटरफ़ेस है, जिसमें accept(Type obj)विधि है। इस इंटरफ़ेस की आवश्यकता क्यों है?

जावा 8 में, संग्रह में एक forEach()विधि है, जो आपको संग्रह के प्रत्येक तत्व के लिए कुछ क्रिया करने देती है । और यहां कार्यात्मक इंटरफ़ेस का उपयोग विधि को कार्रवाई करने के लिए किया जाता है । Consumer<T>forEach()

यहां बताया गया है कि आप किसी संग्रह के सभी तत्वों को कैसे प्रदर्शित कर सकते हैं :

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach( (s) -> System.out.println(s) );
संग्रह के सभी तत्वों को प्रदर्शित करना (लैम्ब्डा अभिव्यक्ति का उपयोग करके)

कंपाइलर ऊपर दिए गए कोड को नीचे दिए गए कोड में बदल देगा:

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach(new Consumer<String>()
{
   public void accept(String s)
   {
      System.out.println(s));
   }
});
संग्रह के सभी तत्वों को प्रदर्शित करना (अज्ञात वर्ग का उपयोग करके)

पहला संस्करण निश्चित रूप से दूसरे से छोटा है। और जबकि लैम्ब्डा एक्सप्रेशन वाले कोड को पढ़ना मुश्किल होता है, अनाम आंतरिक कक्षाओं वाले कोड को पढ़ना कभी-कभी कठिन होता है।



2. विधि संदर्भ

हालाँकि, हमारे लैम्ब्डा एक्सप्रेशन कोड को और भी छोटा लिखा जा सकता है।

सबसे पहले, आप पैरामीटर के चारों ओर कोष्ठकs छोड़ सकते हैं :

list.forEach( (s) -> System.out.println(s) );
पहले
list.forEach( s -> System.out.println(s) );
बाद

यह केवल तभी किया जा सकता है जब एक पैरामीटर हो । यदि कई पैरामीटर हैं , तो आपको कोष्ठक का उपयोग करना चाहिए ।

और दूसरा, आप इसे इस प्रकार लिख सकते हैं:

list.forEach( System.out::println );
सबसे कॉम्पैक्ट नोटेशन

यह ठीक वैसा ही अंकन है। ध्यान दें कि के बाद कोई कोष्ठक नहीं हैं println

यहां हमारे पास एक ही कोड है - एक विधि कॉल:

object::method
x -> object.method(x)

listइसके बारे में सोचें: हम संग्रह के प्रत्येक तत्व के लिए कुछ क्रिया करना चाहते थे । यदि क्रिया एक एकल फ़ंक्शन कॉल (जैसे println()) है, तो यह फ़ंक्शन को पैरामीटर के रूप में विधि को पारित करने के लिए समझ में आता है।

लेकिन हम कंपाइलर को कैसे समझाते हैं कि हम इसे कॉल करने के बजाय मेथड पास करना चाहते हैं? ऐसा करने के लिए, डॉट ऑपरेटर के बजाय, हम विधि नाम से पहले दो कोलन का उपयोग करते हैं। टर्नरी ऑपरेटर को इंगित करने के लिए पहले से ही एक कोलन का उपयोग किया जाता है।

यह सबसे सरल और सबसे कॉम्पैक्ट नोटेशन है।



3. कंस्ट्रक्टर

जब हम I/O स्ट्रीम के साथ काम करते हैं तो डबल कॉलन वाले मेथड रेफरेंस बहुत उपयोगी होते हैं। आप इसे थोड़ी देर बाद देखेंगे।

इस बीच, विधि संदर्भ पास करने के 3 लोकप्रिय तरीकों के बारे में बात करते हैं:

किसी वस्तु की विधि का संदर्भ

किसी ऑब्जेक्ट की विधि के संदर्भ में पास करने के लिए, आपको कुछ लिखना होगा । यह कोड के बराबर है ।object::method
x -> object.method(x)

विशेष thisऔर superचर का उपयोग वस्तु के रूप में किया जा सकता है।

एक वर्ग की एक विधि का संदर्भ

एक स्थिर विधि के संदर्भ को पास करने के लिए, आपको कुछ ऐसा लिखना होगा । यह कोड जैसे कोड में परिवर्तित हो जाता हैclass::methodx -> class.method(x);

एक निर्माता का संदर्भ

एक कंस्ट्रक्टर एक स्टैटिक क्लास मेथड के समान व्यवहार करता है, इसलिए आप एक कंस्ट्रक्टर का संदर्भ भी पास कर सकते हैं। यह कैसा दिखता है: .class::new

उदाहरण के लिए, आप संग्रह के लिए लगभग प्रकार का विलोपन प्राप्त कर सकते हैं और toArray()विधि को एक निर्माता के संदर्भ में पास कर सकते हैं जो वांछित सरणी बनाएगा:toArray(int[]::new);