2013-07-28 3 views
72

जावा -8 स्पेक पर पढ़ना, मैं 'एसएएम प्रकार' के संदर्भ देख रहा हूं। मैं इस बारे में स्पष्ट स्पष्टीकरण नहीं पा रहा हूं कि यह क्या है।जावा में 'एसएएम प्रकार' क्या है?

एसएएम प्रकार क्या है और इसका उपयोग करने के लिए एक उदाहरण परिदृश्य क्या है?

+4

http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-3.html देखें (जो मुझे एक ही खोज के बाद मिला, जो मुझे एक और SO प्रश्न में ले गया)। –

+0

वही है जो मुझे चाहिए था। धन्यवाद! जिज्ञासा से बाहर, आप अपनी खोज में किस कीवर्ड का उपयोग करते थे? – Cody

+2

कृपया लोगों को पुरानी जानकारी का संदर्भ न दें। थोड़ी देर की खोज आपको अधिक अद्यतित संस्करण में ले जाती: http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html, जो स्वयं 18 महीने का है और अब कई जगहों में पुराना है।ओपी के प्रश्न का उत्तर http://www.lambdafaq.org/what-is-a-functional-interface/ पर दिया गया है, एक एफएक्यू में एक पृष्ठ जिसे मैं हाल ही में तेजी से बदलते हुए तक अद्यतित रखने की कोशिश करता हूं भाषा और एपीआई विकास। –

उत्तर

79

संक्षेप करने के मामले में the link Jon posted यह कभी नीचे चला जाता है, "सैम" "एक सार विधि" के लिए खड़ा है, और "सैम-प्रकार" एक नई सुविधा जावा 8 में Runnable, Callable, आदि लैम्ब्डा भाव की तरह इंटरफेस को संदर्भित करता है , एक एसएएम प्रकार माना जाता है और उन्हें स्वतंत्र रूप से परिवर्तित किया जा सकता है।

उदाहरण के लिए, इस तरह एक अंतरफलक के साथ:

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 method का उपयोग करके एक लैम्ब्डा फ़ंक्शन हैंडलर बनाता है, फिर लैम्ब्डा के भविष्य के इनवोकेशन में इस कैश किए गए उदाहरण का उपयोग करता है। अधिक जानकारी this answer में मिल सकती है।

यह दृष्टिकोण जटिल है और यहां तक ​​कि कोड है कि आदिम मूल्यों और संदर्भ ढेर स्मृति से सीधे पढ़ा अपने लैम्ब्डा कोड में पारित करने के लिए कर सकते हैं शामिल हैं (उदाहरण के लिए अपने लैम्ब्डा आह्वान करने के लिए एक Object[] सरणी आवंटित करने के लिए की आवश्यकता होगी, चारों ओर पाने के लिए), लेकिन यह भविष्य की अनुमति देता है बाइटकोड संगतता के बारे में चिंता किए बिना पुराने कार्यान्वयन को बदलने के लिए लैम्ब्डा कार्यान्वयन के पुनरावृत्तियों। यदि ओरेकल के इंजीनियरों ने जेवीएम के एक नए संस्करण में अंतर्निहित लैम्ब्डा कार्यान्वयन को बदल दिया है, तो पुराने जेवीएम पर संकलित लैम्बडास नए कार्यान्वयन का उपयोग करेगा।


एक sidenote के रूप में, लिंक पर वाक्यविन्यास पुराना है। वर्तमान वाक्यविन्यास देखने के लिए Lambda Expressions Java Trail पर एक नज़र डालें।

+0

क्या आप निश्चित हैं कि '# {" हैलो वर्ल्ड! " }; सही वाक्यविन्यास है? मैंने सोचा कि किसी ने इसे लैम्ब्डा अभिव्यक्ति में व्यक्त किया है जैसे '() -> "हैलो वर्ल्ड!"। – asgs

+0

आह, हाँ। मैंने बस @ मॉरीस की टिप्पणियां पढ़ीं। नवीनतम जानकारी को दर्शाने के लिए आपको इस पोस्ट को संपादित करना चाहिए। यह जानकर अच्छा लगा कि '# {}' हालांकि, पहले लैम्बदास का प्रतिनिधित्व कैसे किया गया था। – asgs

+1

@asgs मुझे जावा ट्रेल की तरफ इशारा करते हुए थोड़ा सा अस्पष्ट था, लेकिन मैं आगे बढ़ गया और वर्तमान वाक्यविन्यास का उपयोग करने के लिए वैसे भी जवाब अपडेट किया। – Brian

संबंधित मुद्दे