जावा -8 कल्पना पर पढ़ना, मैं 'एसएएम प्रकार' के संदर्भ देखता हूं। मैं इस बारे में स्पष्ट स्पष्टीकरण नहीं दे पाया हूं कि यह क्या है।
एसएएम प्रकार क्या है और किसी के उपयोग किए जाने पर इसका उदाहरण परिदृश्य क्या है?
जावा -8 कल्पना पर पढ़ना, मैं 'एसएएम प्रकार' के संदर्भ देखता हूं। मैं इस बारे में स्पष्ट स्पष्टीकरण नहीं दे पाया हूं कि यह क्या है।
एसएएम प्रकार क्या है और किसी के उपयोग किए जाने पर इसका उदाहरण परिदृश्य क्या है?
जवाबों:
संक्षेप में लिंक जॉन तैनात 1 मामले में यह कभी नीचे चला जाता है, "सैम" "एक सार विधि" के लिए खड़ा है, और "सैम-प्रकार" की तरह इंटरफेस को संदर्भित करता है Runnable
, Callable
आदि लैम्ब्डा भाव, जावा 8 में एक नई सुविधा, कर रहे हैं एक एसएएम प्रकार माना जाता है और उन्हें स्वतंत्र रूप से परिवर्तित किया जा सकता है।
उदाहरण के लिए, इस तरह के एक इंटरफेस के साथ:
public interface Callable<T> {
public T call();
}
आप Callable
इस तरह से एक लंबोदर भावों की घोषणा कर सकते हैं :
Callable<String> strCallable = () -> "Hello world!";
System.out.println(strCallable.call()); // prints "Hello world!"
इस संदर्भ में लैम्ब्डा अभिव्यक्तियाँ ज्यादातर सिंटैक्टिक शुगर हैं। वे अनाम कक्षाओं की तुलना में कोड में बेहतर दिखते हैं और विधि के नामकरण पर कम प्रतिबंधात्मक हैं। इस उदाहरण को लिंक से लें:
class Person {
private final String name;
private final int age;
public static int compareByAge(Person a, Person b) { ... }
public static int compareByName(Person a, Person b) { ... }
}
Person[] people = ...
Arrays.sort(people, Person::compareByAge);
यह Comparator
एक विशिष्ट विधि का उपयोग करता है जो समान नाम को साझा नहीं करता है Comparator.compare
, इस तरह से आपको तरीकों के नामकरण का पालन करने की आवश्यकता नहीं है और आप एक कक्षा में कई तुलना ओवरराइड कर सकते हैं, फिर मक्खी के माध्यम से तुलना करें लंबोदर भाव।
गहरा जा रहा है ...
एक गहरे स्तर पर, जावा invokedynamic
7 में जोड़े गए बाइटकोड निर्देश का उपयोग करके जावा इनको लागू करता है। मैंने पहले कहा था कि लैम्बडा की घोषणा करने से अनाम वर्ग के समान Callable
या उससे एक उदाहरण बनता है Comparable
, लेकिन यह कड़ाई से सच नहीं है। इसके बजाय, पहली बार invokedynamic
कहा जाता है, यह LambdaMetafactory.metafactory
विधि का उपयोग करके एक लैम्ब्डा फ़ंक्शन हैंडलर बनाता है , फिर लैम्ब्डा के भविष्य के आक्रमणों में इस कैश्ड उदाहरण का उपयोग करता है। इस उत्तर में अधिक जानकारी पाई जा सकती है ।
यह दृष्टिकोण जटिल है और यहां तक कि कोड भी शामिल है जो आपके लैम्बडा कोड में पारित होने के लिए स्टैक मेमोरी से सीधे आदिम मूल्यों और संदर्भों को पढ़ सकता है (जैसे कि Object[]
अपने लैम्ब्डा को आह्वान करने के लिए एक सरणी आवंटित करने की आवश्यकता है), लेकिन यह लैम्ब्डा कार्यान्वयन के भविष्य के पुनरावृत्तियों की अनुमति देता है। पुराने कार्यान्वयन को बदलने के लिए बिना बायोटेक अनुकूलता के बारे में चिंता किए बिना। यदि ओरेकल के इंजीनियर जेवीएम के एक नए संस्करण में अंतर्निहित लैम्ब्डा कार्यान्वयन को बदलते हैं, तो पुराने जेवीएम पर संकलित लैम्ब्डा स्वचालित रूप से डेवलपर के हिस्से पर बिना किसी बदलाव के नए कार्यान्वयन का उपयोग करेगा।
1 लिंक पर वाक्य रचना पुराना है। वर्तमान सिंटैक्स को देखने के लिए लैम्ब्डा एक्सप्रेशंस जावा ट्रेल पर एक नज़र डालें ।