विधि संदर्भ लंबर आवरण के ओवरहेड को छोड़ दें? क्या वे भविष्य में हो सकते हैं?
विधि संदर्भों पर जावा ट्यूटोरियल के अनुसार :
कभी-कभी ... एक लंबोदर अभिव्यक्ति एक मौजूदा पद्धति के अलावा कुछ नहीं करती है। उन मामलों में, मौजूदा विधि को नाम से संदर्भित करना अक्सर स्पष्ट होता है। विधि संदर्भ आपको ऐसा करने में सक्षम करते हैं; वे उन विधियों के लिए कॉम्पैक्ट, आसानी से पढ़े जाने वाले लैम्बडा एक्सप्रेशन हैं जिनका पहले से ही एक नाम है।
मैं लैंबडा सिंटैक्स को कई कारणों से विधि संदर्भ सिंटैक्स के लिए पसंद करता हूं:
लंबोदर स्पष्ट हैं
ओरेकल के दावों के बावजूद, मुझे लैम्बडा सिंटैक्स आसानी से पढ़ने के लिए ऑब्जेक्ट विधि संदर्भ शॉर्ट-हैंड से मिलता है क्योंकि विधि संदर्भ सिंटैक्स अस्पष्ट है:
Bar::foo
क्या आप x के वर्ग पर एक स्थिर एक-तर्क पद्धति को बुला रहे हैं और इसे x पास कर रहे हैं?
x -> Bar.foo(x)
या आप x पर शून्य-तर्क उदाहरण विधि कह रहे हैं?
x -> x.foo()
विधि संदर्भ सिंटैक्स किसी एक के लिए भी खड़ा हो सकता है। यह छुपाता है कि आपका कोड वास्तव में क्या कर रहा है।
लंबोदर सुरक्षित हैं
यदि आप बार का संदर्भ देते हैं :: वर्ग विधि के रूप में फू और बार बाद में उसी नाम (या इसके विपरीत) की एक आवृत्ति विधि जोड़ता है, तो आपका कोड अब संकलित नहीं होगा।
आप लैम्ब्डा का लगातार उपयोग कर सकते हैं
आप किसी भी फ़ंक्शन को लैम्ब्डा में लपेट सकते हैं - इसलिए आप हर जगह एक ही वाक्यविन्यास का लगातार उपयोग कर सकते हैं। विधि संदर्भ वाक्यविन्यास उन तरीकों पर काम नहीं करेगा जो आदिम सरणियों को लेते या वापस करते हैं, जाँच किए गए अपवादों को फेंकते हैं, या एक ही विधि का नाम उदाहरण और स्थिर विधि के रूप में उपयोग किया जाता है (क्योंकि विधि संदर्भ वाक्यविन्यास अस्पष्ट है कि किस विधि को कहा जाएगा) । जब आप एक ही नंबर के तर्कों के साथ तरीकों को ओवरलोड कर लेते हैं, तो वे काम नहीं करते हैं, लेकिन आपको वैसे भी ऐसा नहीं करना चाहिए (जोश बलोच के आइटम 41 देखें) ताकि हम इसे विधि संदर्भ के विरुद्ध न पकड़ सकें।
निष्कर्ष
यदि ऐसा करने के लिए कोई प्रदर्शन दंड नहीं है, तो मुझे अपनी आईडीई में चेतावनी को बंद करने का प्रलोभन दिया जाता है और मेरे कोड में सामयिक पद्धति के संदर्भ को छिड़कने के बिना लैम्ब्डा सिंटैक्स का लगातार उपयोग किया जाता है।
पुनश्च
न तो यहां और न ही, लेकिन मेरे सपनों में, ऑब्जेक्ट विधि संदर्भ इस तरह दिखते हैं और एक लैम्ब्डा आवरण के बिना ऑब्जेक्ट पर सीधे विधि के खिलाफ इनवोक-डायनेमिक लागू करते हैं:
_.foo()
.map(_.acceptValue())
: अगर मैं गलत नहीं हूं, तो यह बहुत हद तक स्काला सिंटैक्स की तरह दिखता है। हो सकता है कि आप सिर्फ गलत भाषा का उपयोग करने की कोशिश कर रहे हों।
System.out::println
करने के लिए forEach()
हर समय ...?