java - जावा लैम्ब्डा और क्लोज़र्स




lambda closures (2)

  • टीम ए और टीम बी कहां हैं? या वे (जेनेरिक के कुछ अजीब रूप की तरह) नहीं हैं?

लैम्ब्डा का उपयोग लक्ष्य टाइपिंग, बहुत सामान्य विधि कॉल (1.5 से) और हीरा [एक नहीं] ऑपरेटर (1.7 से) के समान है। मोटे तौर पर, जहां पर परिणाम लागू होता है (या अनुमान लगाया जा सकता है) जिसका उपयोग एकल सार विधि (एसएएम) आधार प्रकार के प्रकार के लिए किया जाता है और इसलिए विधि पैरामीटर प्रकार।

1.5 में सामान्य विधि अनुमान के उदाहरण के रूप में:

Set<Team> noTeams = Collections.emptySet(); 

और 1.7 में हीरा ऑपरेटर:

Set<Team> aTeams = new HashSet<>();

टीम, टीम, टीम, टीम, टीम, टीम मैं शब्द टीम को कहने में भी प्यार करता हूं

  • क्या लैम्ब्डा एक प्रकार का बंद है, या यह दूसरी तरह का है?

एक लैम्ब्डा लगभग समान रूप से गुमनाम आंतरिक कक्षाओं में बंद होने का एक सीमित रूप है, लेकिन कुछ यादृच्छिक अंतर से आपको पकड़ने के लिए:

बाहरी this एक आंतरिक द्वारा छिपा नहीं है। इसका अर्थ है कि लैम्ब्डा और एक गुमनाम अंदरूनी कक्षा में एक ही पाठ का मतलब सूक्ष्म लेकिन पूरी तरह से अलग चीजें हो सकता है। उस अजीब सवालों के साथ स्टैक ओवरफ़्लो व्यस्त रखना चाहिए

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

स्थानीय फ़ील्ड जो final रूप में चिन्हित होने के लिए नहीं होते हैं लेकिन हो सकता है कि उन्हें final रूप में माना जाता है जैसे कि वे final । तो वे क्षेत्र में नहीं हैं, लेकिन आप वास्तव में पढ़ सकते हैं (हालांकि नहीं लिखना) उन्हें।

  • यह एक विशिष्ट गुमनाम समारोह में मुझे क्या लाभ देगा?

एक ब्रीफ़र सिंटैक्स यह इसके बारे में।

बेशक, जावा वाक्यविन्यास के बाकी हिस्सों की तरह अभी भी बुरी तरह खराब है

मुझे विश्वास नहीं है कि यह प्रारंभिक कार्यान्वयन में है, लेकिन [आंतरिक] कक्षाओं के रूप में कार्यान्वित किए जाने के बजाय, लैम्ब्दा विधि पद्धतियों का उपयोग कर सकते हैं। विधि संभालता का प्रदर्शन पहले की भविष्यवाणियों के कुछ हद तक कम हो जाता है कक्षाओं के साथ दूर होकर, बाइटकोड पदचिह्न, संभवतः रनटाइम पदचिह्न और निश्चित तौर पर कक्षा लोडिंग समय को कम करना चाहिए। एक कार्यान्वयन हो सकता है, जहां सबसे अनोखी आंतरिक कक्षाएं ( Serializable नहीं, तुच्छ स्थिर प्रारंभिक) बिना किसी विशेष रूप से ध्यान देने योग्य असंगतियों के खराब खराब कक्षा लोडिंग तंत्र के माध्यम से नहीं आईं।

(आशा है कि मुझे शब्दावली wrt छुपा सही है।)

मैंने सुना है कि लम्ब्दास जल्द ही एक जावा के पास आ रहे हैं (जे 8)। मुझे एक उदाहरण मिल गया है कि वे कुछ ब्लॉग पर कैसा दिखेंगे:

SoccerService soccerService = (teamA, teamB) -> {
    SoccerResult result = null;
    if (teamA == teamB) {
        result = SoccerResult.DRAW;
    }
    else if(teamA < teamB) {
        result = SoccerResult.LOST;
    }
    else {
        result = SoccerResult.WON;
    }

    return result;
};

तो बल्ले से सही:

  • teamA और teamB teamA कहां हैं? या वे (जेनेरिक के कुछ अजीब रूप की तरह) नहीं हैं?
  • क्या लैम्ब्डा एक प्रकार का बंद है, या यह दूसरी तरह का है?
  • यह एक विशिष्ट गुमनाम समारोह में मुझे क्या लाभ देगा?

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

उदाहरण के लिए:

Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);

इस अभिव्यक्ति में, लैम्ब्डा की अभिव्यक्ति स्पष्ट रूप से तार के संगतता को लागू करती है, इसलिए, इसका अर्थ है लैम्ब्डा अभिव्यक्ति वाक्य compare(String, String) को लागू compare(String, String) लिए वाक्यविन्यास चीनी है।

इस प्रकार, संकलक सुरक्षित रूप से s1 और s1 के प्रकार को मान सकते हैं String

आपका लक्ष्य इंटरफ़ेस प्रकार सभी जानकारी प्रदान करता है कि कंपाइलर को निर्धारित करने की आवश्यकता है कि लैम्ब्डा मापदंडों के वास्तविक प्रकार क्या हैं।

ब्रायन गेट्ज़, ओरेकल कोरपोर्टन में जावा लैंग्वेज आर्किटेक्ट ने जेडीके 8 लैम्ब्डा में काम के कुछ लेख प्रकाशित किए हैं। मेरा मानना ​​है कि आपके प्रश्नों के उत्तर यहां हैं:

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





java-8