2014-06-30 9 views
61

इंटेलिजे मुझे विधि संदर्भों के साथ अपने लैम्ब्डा अभिव्यक्तियों को प्रतिस्थापित करने का प्रस्ताव रखता है।लैम्ब्डा अभिव्यक्ति बनाम विधि संदर्भ

क्या दोनों के बीच कोई उद्देश्य अंतर है?

+1

यह वही चीजें हैं, लेकिन आपको 'files.stream()। नक्शा (फ़ाइल :: getName) जैसी सुंदर चीज़ नहीं मिलती है? –

+4

वास्तव में नहीं, मुझे कोई वस्तु नहीं दिखाई दे रही है!ऐसा लगता है कि मुझे – Gerard

+0

"जैसा दिखता है" एक स्थिर कॉल की तरह दिखता है, मुझे लगता है कि यह एक तर्क नहीं है। –

उत्तर

7

लांग लैम्ब्डा अभिव्यक्तियों में कई कथन शामिल हैं आपके कोड के को कम कर सकते हैं। ऐसे मामले में, उन बयानों को एक विधि में निकालने और इसे संदर्भित करना बेहतर विकल्प हो सकता है।

अन्य कारण पुनः उपयोगिता हो सकता है। & की प्रतिलिपि बनाने के बजाय कुछ कथनों की अपनी लैम्ब्डा अभिव्यक्ति चिपकाते हुए, आप एक विधि बना सकते हैं और इसे अपने कोड के विभिन्न स्थानों से कॉल कर सकते हैं।

+1

तुलना करें: 'houses.map (हाउस :: getName)' और 'houses.map (h -> h.getName())'। लैम्ब्डा दो कम अक्षर लेता है। यह सच है कि प्रकार स्पष्ट नहीं है, लेकिन कोई भी आईडीई आपको बताएगा, और इसके अलावा, जब प्रकार स्पष्ट होता है तो लैम्बडा का उपयोग किया जाना चाहिए। मैं पुन: प्रयोज्यता के साथ आपसे सहमत हो सकता हूं, लेकिन लैम्ब्डा बिल्कुल छोटे हैं इसलिए उन्हें बड़े विशिष्ट तरीकों के निर्माण के बजाय जंजीर बनाया जा सकता है। उस अर्थ में, छोटी विधियां कुछ बड़ी और जटिल विधि की तुलना में अधिक पुन: प्रयोज्य होती हैं, और लैम्ब्डा की स्पष्टता (और कुछ डिग्री, क्रियापदता) के कारण वे अभी भी पढ़ने में आसान हैं। – Gerard

+8

मैं गेराल्ड के साथ हूं। जब आप कोड बाहर ले जाते हैं तो पठनीयता वास्तव में पीड़ित होती है, इसलिए आपको पढ़ने के लिए इसे कूदना होगा, फिर वापस कूदें। आप * एक ही स्थान पर सभी प्रासंगिक कोड चाहते हैं। इसके अलावा, 'हाउस' एक बहुत ही सौहार्दपूर्ण उदाहरण है; 'थ्रीस्टोरीरेडब्रिकहाउस विथब्लू डूर्स' के बारे में क्या। मैं बहु-तर्क लैम्बडास के लिए विधि संदर्भ पसंद करता हूं, और कभी-कभी यह जोर देने के लिए कि लैम्ब्डा केवल एक विधि कॉल के बारे में है। विधि संदर्भ के साथ गलत होने के लिए कम है: आप उपयोग साइट पर तर्क को गलत तरीके से गलत तरीके से गलत तरीके से संदर्भित कर सकते हैं, –

+0

@Gerard मैं आपके पहले कथन से असहमत हूं। यदि आप अच्छी तरह से वर्णन करने वाले विधि नामों का उपयोग करते हैं और यदि आप कोड के बड़े ढेर निकालते हैं, तो चलती कोड पठनीयता में सुधार करती है। यदि आप obfuscating विधि नामों का उपयोग करते हैं तो मैं आपके साथ सहमत हूं। – Torsten

95

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

ध्यान दें कि है कोई सही उत्तर। कोई भी जो कहता है "हमेशा एक लैम्बडा के बजाय एक विधि रेफरी का उपयोग करें" या "हमेशा एक विधि रेफरी के बजाय लैम्ब्डा का उपयोग करें" को अनदेखा किया जाना चाहिए।

यह सवाल भावना में बहुत समान है कि "मुझे नामित कक्षा का उपयोग अज्ञात वर्ग के रूप में कब करना चाहिए"? और जवाब वही है: जब आपको यह अधिक पठनीय लगता है। निश्चित रूप से ऐसे मामले हैं जो निश्चित रूप से एक या निश्चित रूप से दूसरे हैं लेकिन मध्य में बहुत सारे ग्रे हैं, और निर्णय का उपयोग किया जाना चाहिए।

विधि रेफरी के पीछे सिद्धांत सरल है: नाम मायने रखता है। यदि किसी विधि का नाम है, तो कोड के अनिवार्य बैग के बजाए इसे नाम से संदर्भित करना जो आखिरकार बस घूमता है और इसे आमंत्रित करता है, अक्सर (लेकिन हमेशा नहीं!) अधिक स्पष्ट और पठनीय होता है।

प्रदर्शन के बारे में तर्क या वर्णों की गिनती के बारे में तर्क ज्यादातर लाल बालियां हैं, और आपको उन्हें अनदेखा करना चाहिए। लक्ष्य कोड लिख रहा है जो क्रिस्टल स्पष्ट करता है कि यह क्या करता है। बहुत बार (लेकिन हमेशा नहीं!) विधि इस मीट्रिक पर जीत जीतती है, इसलिए हमने उन मामलों में उपयोग करने के लिए उन्हें एक विकल्प के रूप में शामिल किया।

विधि के बारे में एक महत्वपूर्ण विचार यह है कि क्या विधि स्पष्ट रूप से स्पष्ट करती है या इरादा उत्पन्न करती है या नहीं, यह संदर्भ से स्पष्ट है कि फ़ंक्शन का आकार किस प्रकार प्रदर्शित किया जा रहा है। कुछ मामलों में (उदाहरण के लिए, map(Person::getLastName), यह संदर्भ से काफी स्पष्ट है कि एक फ़ंक्शन जो किसी चीज़ को दूसरे स्थान पर मैप करता है, और इस तरह के मामलों में, विधि संदर्भ चमकते हैं। दूसरों में, एक विधि रेफरी का उपयोग करने के लिए पाठक को आश्चर्य होता है कि क्या फ़ंक्शन का वर्णन किया जा रहा है; यह एक चेतावनी संकेत है कि एक लैम्ब्डा अधिक पठनीय हो सकता है, भले ही लंबा हो।

अंत में, हमने पाया है कि अधिकांश लोग पहले विधि रीफ से दूर हो जाते हैं क्योंकि वे लैम्बडास से भी नए और वीडर महसूस करते हैं, और इसलिए शुरुआत में उन्हें "कम पठनीय" लगता है, लेकिन समय के साथ, जब वे वाक्यविन्यास में उपयोग करते हैं, आम तौर पर उनके व्यवहार को बदलते हैं और जब वे कर सकते हैं तो विधि संदर्भों की ओर अग्रसर होते हैं। इसलिए ध्यान रखें कि स्वयं व्यक्तिपरक प्रारंभिक "कम पठनीय" प्रतिक्रिया लगभग निश्चित रूप से familarit के कुछ पहलू को लागू करती है वाई पूर्वाग्रह, और आपको स्टाइलिस्ट राय प्रस्तुत करने से पहले दोनों के साथ सहज महसूस करने का मौका देना चाहिए।

+28

मैंने पूछा कि क्या कोई अंतर है, गीला नहीं, मुझे एक विकल्प या दूसरे का उपयोग करना चाहिए। – Gerard

+21

@ गेरार्ड धन्यवाद आप एक बेहतर जवाब होगा। –

+0

@ जेरार्ड ऐसा लगता है जैसे ब्रायन कह रहा है "नहीं, वहां नहीं है" – dj18

संबंधित मुद्दे