दिलचस्प पोस्ट
Google Drive API ProGuard (NPE) के साथ अच्छी तरह से नहीं खेलता है सी # में एईएस एन्क्रिप्शन का उपयोग करना बैश में एक वेरिएबल में नई पंक्ति को एम्बेड करने की कोशिश कैसे RelativeLayout प्रोग्राम में दृश्यों को बाहर रखना है? WPF निष्क्रियता और गतिविधि JQuery के साथ सारणी बनाएं – संलग्न करें आधिकारिक जेएसपी ट्यूटोरियल कहां है एक ही इकाई के साथ कई-से-कई सहयोग को हाइबरनेट करें रीढ़ की हड्डी, नहीं "this.el" रैपिंग Std :: regex_match और std :: regex_search के बीच का अंतर? खिड़की.क्योंकि आईपैड पर काम नहीं कर रहा है? पायथन असाइनमेंट एक मूल्य क्यों नहीं लौटाता है? जावास्क्रिप्ट में सरणी चौराहे के लिए सबसे सरल कोड एक विशेष मान के लिए सभी सबसेट्स का पता लगाएं Easy_install / pip के साथ स्थापित किए गए सभी पैकेज खोजें?

जावा 8 लैम्ब्डा बनाम बेनामी क्लासेस

चूंकि जावा 8 को हाल ही में जारी किया गया है और इसके ब्रांड लैम्ब्डा की अभिव्यक्ति वास्तव में शांत दिखती है, मैं सोच रहा था कि क्या इसका अर्थ है कि बेनामी कक्षाओं के निधन का मतलब है कि हम इतने के लिए इस्तेमाल किए गए थे।

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

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

अब लैम्ब्डा का उपयोग किया जा सकता है:

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

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

संपादित करें

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

Solutions Collecting From Web of "जावा 8 लैम्ब्डा बनाम बेनामी क्लासेस"

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

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

अद्यतन करें

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

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

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

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

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

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

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

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

अनाम वर्गों के साथ लैम्ब्डा प्रदर्शन

जब आवेदन शुरू किया जाता है तो प्रत्येक श्रेणी फ़ाइल को लोड और सत्यापित किया जाना चाहिए।

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

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

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

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

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

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

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

निम्नलिखित मतभेद हैं:

1) सिंटेक्स

लम्बेडा भाव दिखता दिखता है बेनामी इनर क्लास (एआईसी) की तुलना में

 public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { System.out.println("in run"); } }; Thread t = new Thread(r); t.start(); } //syntax of lambda expression public static void main(String[] args) { Runnable r = ()->{System.out.println("in run");}; Thread t = new Thread(r); t.start(); } 

2। घेरा

एक गुमनाम आंतरिक वर्ग एक वर्ग है, जिसका अर्थ है कि इसके भीतर की कक्षा के भीतर परिभाषित चर के लिए गुंजाइश है।

जबकि, लैम्ब्डा अभिव्यक्ति स्वयं की कोई गुंजाइश नहीं है, परन्तु संलग्न क्षेत्र का हिस्सा है।

समान नियम लागू होता है सुपर और इस कीवर्ड के लिए जब अनाम आंतरिक कक्षा और लैम्ब्डा अभिव्यक्ति के अंदर प्रयोग किया जाता है। गुमनाम इनर क्लास के मामले में यह कीवर्ड स्थानीय क्षेत्र को संदर्भित करता है और सुपर कीवर्ड अनाम क्लास के सुपर क्लास को संदर्भित करता है। लैम्ब्डा अभिव्यक्ति के मामले में यह कीवर्ड संलग्न प्रकार और सुपर के ऑब्जेक्ट को संदर्भित करता है जिसमें संलग्न कक्षा के सुपर क्लास का संदर्भ दिया जाएगा।

 //AIC public static void main(String[] args) { final int cnt = 0; Runnable r = new Runnable() { @Override public void run() { int cnt = 5; System.out.println("in run" + cnt); } }; Thread t = new Thread(r); t.start(); } //Lambda public static void main(String[] args) { final int cnt = 0; Runnable r = ()->{ int cnt = 5; //compilation error System.out.println("in run"+cnt);}; Thread t = new Thread(r); t.start(); } 

3) प्रदर्शन

रनटाइम अनाम इनर क्लास में क्लास लोडिंग, मेमरी आवंटन और ऑब्जेक्ट इनिशियलाइज़ेशन और गैर-स्टैटिक पद्धति की आवाज़ की आवश्यकता होती है, जबकि लैम्ब्डा एक्सप्रेशन शुद्ध संकलन टाइम गतिविधि है और रनटाइम के दौरान अतिरिक्त लागत नहीं होती है। तो लैम्ब्डा अभिव्यक्ति का प्रदर्शन, गुमनाम आंतरिक कक्षाओं की तुलना में बेहतर होता है। **

** मुझे पता है कि यह मुद्दा पूरी तरह से सच नहीं है। कृपया विवरण के लिए निम्नलिखित प्रश्न देखें। लैम्ब्डा बनाम बेमेल इनर क्लास प्रदर्शन: कक्षा लोडर पर भार को कम करना?