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::method
x -> class.method(x);
एक निर्माता का संदर्भ
एक कंस्ट्रक्टर एक स्टैटिक क्लास मेथड के समान व्यवहार करता है, इसलिए आप एक कंस्ट्रक्टर का संदर्भ भी पास कर सकते हैं। यह कैसा दिखता है: .class::new
उदाहरण के लिए, आप संग्रह के लिए लगभग प्रकार का विलोपन प्राप्त कर सकते हैं और toArray()
विधि को एक निर्माता के संदर्भ में पास कर सकते हैं जो वांछित सरणी बनाएगा:toArray(int[]::new);
GO TO FULL VERSION