java - जावा 8 लैम्ब्डा अभिव्यक्ति और प्रथम श्रेणी के मान




lambda java-8 (5)

बाहरी संदर्भ में परिवर्तनीय बाध्यकारी के साथ एक वास्तविक बंद कुछ ओवरहेड है। मैं जावा 8 इष्टतम, पर्याप्त शुद्ध के कार्यान्वयन पर विचार करता हूं।

यह कम से कम वाक्य रचनात्मक चीनी नहीं है।

और मैं किसी और इष्टतम कार्यान्वयन के बारे में नहीं जानता।

क्या जावा 8 वास्तव में प्रथम श्रेणी के मूल्य बंद करता है या वे केवल एक वाक्य रचनात्मक चीनी हैं?


हां , वे प्रथम श्रेणी मान हैं (या होगा, जावा 8 जारी होने के बाद ...)

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

इस संदर्भ में "प्रथम श्रेणी" का अर्थ क्या है, इसकी एक और परिभाषा के लिए भी देखें:


मेरे लिए जावा 8 में लैम्ब्डास सिर्फ सिंटैक्स चीनी है क्योंकि आप इसे प्रथम श्रेणी नागरिक ( http://en.wikipedia.org/wiki/First-class_function ) के रूप में उपयोग नहीं कर सकते हैं, प्रत्येक फ़ंक्शन को ऑब्जेक्ट में लपेटा जाना चाहिए, इसकी तुलना करते समय कई सीमाएं लगाती हैं एससीएएलए जैसे शुद्ध प्रथम श्रेणी समारोह के साथ भाषा। जावा 8 क्लोजर केवल अपरिवर्तनीय ("प्रभावी रूप से अंतिम") गैर-स्थानीय चर पकड़ सकता है।

यहां बेहतर स्पष्टीकरण है कि यह सिंटैक्स-चीनी जावा लैम्बडास और क्लोजर क्यों है


जैसा कि मैंने इसे देखा, यह सिंटेक्टिक चीनी है, लेकिन प्रकार के अनुमान के साथ, एक नया पैकेज java.util.functions और आंतरिक कक्षाओं का अर्थपूर्ण यह प्रथम श्रेणी के मान के रूप में दिखाई देता है।


इस तथ्य के अलावा कि शाखा भविष्यवाणी आपको धीमा कर सकती है, एक क्रमबद्ध सरणी का एक और फायदा है:

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

 // sort backwards (higher values first)
 std::sort(data, data + arraySize, std::greater<int>());

 for (unsigned c = 0; c < arraySize; ++c) {
       if (data[c] < 128) {
              break;
       }
       sum += data[c];               
 }




java lambda java-8