लैम्ब्डा अभिव्यक्तियाँ उन समस्याओं के सेट को नहीं बदलती हैं जिन्हें आप सामान्य रूप से जावा के साथ हल कर सकते हैं, लेकिन निश्चित रूप से कुछ समस्याओं को हल करना आसान बनाते हैं, बस इसी कारण से हम असेंबली भाषा में प्रोग्रामिंग नहीं कर रहे हैं। प्रोग्रामर के काम से अनावश्यक कार्यों को हटाने से जीवन आसान हो जाता है और उन चीजों को करने की अनुमति देता है जिन्हें आप अन्यथा स्पर्श भी नहीं करेंगे, बस आपको कोड की मात्रा (मैन्युअल रूप से) का उत्पादन करना होगा।
लेकिन लैम्ब्डा एक्सप्रेशन सिर्फ कोड की लाइनें नहीं बचा रहे हैं। लैम्ब्डा अभिव्यक्तियाँ आपको कार्यों को परिभाषित करने की अनुमति देती हैं , कुछ ऐसा जिसके लिए आप पहले इनर क्लासेज को वर्कअराउंड के रूप में उपयोग कर सकते हैं, इसीलिए आप इन मामलों में अनाम इनर क्लासेस को बदल सकते हैं, लेकिन सामान्य रूप से नहीं।
सबसे विशेष रूप से, लंबोदर अभिव्यक्तियों को स्वतंत्र रूप से कार्यात्मक इंटरफ़ेस में परिभाषित किया गया है जिसे वे परिवर्तित कर देंगे, इसलिए कोई विरासत में सदस्य नहीं हैं जो वे एक्सेस कर सकते हैं, आगे, वे कार्यात्मक इंटरफ़ेस को लागू करने के प्रकार के उदाहरण तक पहुंच नहीं सकते हैं। एक लंबोदर अभिव्यक्ति के भीतर, this
और super
आसपास के संदर्भ के रूप में एक ही अर्थ है, यह उत्तर भी देखें । इसके अलावा, आप आसपास के संदर्भ के स्थानीय चर को छायांकित करते हुए नए स्थानीय चर नहीं बना सकते हैं। किसी फ़ंक्शन को परिभाषित करने के इच्छित कार्य के लिए, यह बहुत सारे त्रुटि स्रोतों को हटा देता है, लेकिन इसका अर्थ यह भी है कि अन्य उपयोग के मामलों के लिए, अनाम आंतरिक वर्ग हो सकते हैं जो एक लंबर एक्सप्रेशन में परिवर्तित नहीं हो सकते हैं, भले ही एक कार्यात्मक इंटरफ़ेस लागू करना हो।
इसके अलावा, निर्माण new Type() { … }
एक नए विशिष्ट उदाहरण का उत्पादन करने की गारंटी देता है (जैसा कि new
हमेशा होता है)। अनाम आंतरिक श्रेणी के उदाहरण हमेशा गैर- static
संदर्भ में बनाए जाने पर उनके बाहरी उदाहरण का संदर्भ रखते हैं। इसके विपरीत, लैम्ब्डा भाव केवल this
जरूरत पड़ने पर एक संदर्भ को कैप्चर करते हैं, अर्थात यदि वे पहुंचते हैं this
या गैर- static
सदस्य होते हैं। और वे जानबूझकर अनिर्दिष्ट पहचान के उदाहरणों का उत्पादन करते हैं, जो कार्यान्वयन को रनटाइम पर निर्णय लेने की अनुमति देता है कि क्या मौजूदा उदाहरणों का पुन: उपयोग करना है (यह भी देखें कि क्या " लैम्ब्डा अभिव्यक्ति हर बार निष्पादित होने पर ढेर पर ऑब्जेक्ट बनाता है? ")।
ये अंतर आपके उदाहरण पर लागू होते हैं। आपका अनाम आंतरिक वर्ग निर्माण हमेशा एक नया उदाहरण प्रस्तुत करेगा, साथ ही यह बाहरी उदाहरण के संदर्भ को भी कैप्चर कर सकता है, जबकि आपकी (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())
गैर-कैप्चरिंग लैम्ब्डा अभिव्यक्ति है जो विशिष्ट कार्यान्वयन में एक सिंगलटन का मूल्यांकन करेगी। इसके अलावा, यह .class
आपकी हार्ड ड्राइव पर एक फ़ाइल का उत्पादन नहीं करता है ।
दोनों, सिमेंटिक और प्रदर्शन के बारे में मतभेदों को देखते हुए, लैम्ब्डा के भावों में बदलाव हो सकता है जिस तरह से प्रोग्रामर भविष्य में कुछ समस्याओं को हल करेंगे, निश्चित रूप से नए APIs के कारण कार्यात्मक प्रोग्रामिंग के विचारों को नई भाषा सुविधाओं का उपयोग करते हुए। जावा 8 लैम्ब्डा अभिव्यक्ति और प्रथम श्रेणी के मूल्यों को भी देखें ।
(o1, o2) -> o1.getName().compareTo(o2.getName())