Java8 Lambdas बनाम अज्ञात कक्षाएं




java-8 anonymous-class (4)

चूंकि जावा 8 को हाल ही में रिलीज़ किया गया है और इसकी ब्रांड नई लैम्ब्डा एक्सप्रेशन वास्तव में अच्छी लगती है, मैं सोच रहा था कि इसका मतलब बेनामी वर्गों का निधन है जिसका हम इतना उपयोग करते थे।

मैं इसके बारे में थोड़ा सा शोध कर रहा हूं और इस बारे में कुछ अच्छे उदाहरण पाए हैं कि कैसे लैम्ब्डा अभिव्यक्ति व्यवस्थित रूप से उन वर्गों को प्रतिस्थापित करेंगे, जैसे संग्रह की सॉर्ट विधि, जो सॉर्ट करने के लिए तुलनात्मक का अज्ञात उदाहरण प्राप्त करती थी:

Collections.sort(personList, new Comparator<Person>(){
  public int compare(Person p1, Person p2){
    return p1.firstName.compareTo(p2.firstName);
  }
});

अब Lambdas का उपयोग करके किया जा सकता है:

Collections.sort(personList, (Person p1, Person p2) -> p1.firstName.compareTo(p2.firstName));

और आश्चर्यजनक रूप से संक्षेप में दिखता है। तो मेरा सवाल यह है कि क्या लैम्बदास के बजाय जावा 8 में उन कक्षाओं का उपयोग करने का कोई कारण है?

संपादित करें

वही प्रश्न, लेकिन विपरीत दिशा में, बेनामी वर्गों के बजाय लैम्ब्डास का उपयोग करने के क्या फायदे हैं, क्योंकि लैम्बडास का उपयोग केवल एक विधि इंटरफेस के साथ किया जा सकता है, क्या यह नई सुविधा केवल कुछ मामलों में उपयोग की जाने वाली शॉर्टकट है या क्या यह वास्तव में उपयोगी है?


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

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

अद्यतन करें

एआईसी और लैम्ब्डा अभिव्यक्तियों के बीच एक और अंतर यह है कि एआईसी एक नया दायरा पेश करता है। यही है, नाम एआईसी के सुपरक्लास और इंटरफेस से हल किए गए हैं और अक्षीय रूप से संलग्न पर्यावरण में होने वाले नामों को छाया कर सकते हैं। लैम्बडास के लिए, सभी नामों को स्पष्ट रूप से हल किया जाता है।


बेनामी कक्षाओं के साथ Lambda प्रदर्शन

जब एप्लिकेशन लॉन्च किया जाता है तो प्रत्येक वर्ग फ़ाइल को लोड और सत्यापित किया जाना चाहिए।

बेनामी वर्गों को दिए गए वर्ग या इंटरफ़ेस के लिए एक नए उप प्रकार के रूप में संकलक द्वारा संसाधित किया जाता है, इसलिए प्रत्येक के लिए एक नई कक्षा फ़ाइल तैयार की जाएगी।

लैम्बडास बाइटकोड पीढ़ी पर अलग हैं, वे अधिक कुशल हैं, इनकेडैडीनामिक निर्देश का उपयोग जो जेडीके 7 के साथ आता है।

Lambdas के लिए इस निर्देश का उपयोग बाइटकोड अभिव्यक्ति को बाइटकोड में बिना रनटाइम में अनुवाद करने में देरी के लिए किया जाता है। (निर्देश केवल पहली बार लागू किया जाएगा)

नतीजतन Lambda अभिव्यक्ति एक स्थिर विधि बन जाएगा (रनटाइम पर बनाया गया)। (Stateles और statefull मामलों के साथ एक छोटा अंतर है, वे जेनरेट विधि तर्क के माध्यम से हल कर रहे हैं)


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

तो, नहीं, हम अज्ञात वर्गों को अनदेखा नहीं कर सकते हैं। और केवल एफवाईआई, p1 और p1 p2 लिए प्रकार की घोषणा छोड़कर, आपकी sort() विधि अधिक सरल हो सकती है:

Collections.sort(personList, (p1, p2) -> p1.firstName.compareTo(p2.firstName));

आप यहां विधि संदर्भ का भी उपयोग कर सकते हैं। या तो आप Person वर्ग में compareByFirstName() विधि जोड़ें, और उपयोग करें:

Collections.sort(personList, Person::compareByFirstName);

या, firstName लिए गेटर जोड़ें, सीधे Comparator.comparing() विधि से Comparator.comparing() प्राप्त करें:

Collections.sort(personList, Comparator.comparing(Person::getFirstName));

जावा 8 में लैम्ब्डा को कार्यात्मक प्रोग्रामिंग के लिए पेश किया गया था। जहां आप बॉयलरप्लेट कोड से बच सकते हैं। मैं लैम्ब्डा के इस दिलचस्प लेख में आया था।

http://radar.oreilly.com/2014/04/whats-new-in-java-8-lambdas.html

सरल तर्कशास्त्र के लिए लैम्ब्डा कार्यों का उपयोग करना उचित है। यदि समस्या के मामले में कोड को डीबग करने में लैम्बडास का उपयोग करके जटिल तर्क लागू करना ओवरहेड होगा।





anonymous-class