2017-10-16 17 views
8

चलो नीचे दिए गए कोड को देखें।कैसे एक लैम्ब्डा अभिव्यक्ति एक कार्यात्मक इंटरफेस में नक्शा?

List<String> names = Arrays.asList("Adam", "Brian", "Supun"); 
    List<Integer> lengths = names.stream() 
           .map(name -> name.length()) 
           .collect(Collectors.toList()); 

और बस उसके बाद streams.map के लिए javadoc पर दिखेगा। map विधि के लिए हस्ताक्षर इस तरह दिखाई देता है।

<R> Stream<R> map(Function<? super T,? extends R> mapper) 

किसी कृपया व्याख्या कर सकते हैं कि कैसे JVM नक्शे लैम्ब्डा अभिव्यक्ति हम दे दी है (name -> name.length()) Function<? super T,? extends R> mapper के मामले में?

+2

आप क्या करने की कोशिश कर रहे हैं? आपको स्ट्रीम प्रकार के स्थानीय चर बनाने की आवश्यकता नहीं है। क्या आप 'names.stream() के लिए देख रहे हैं। मानचित्र (...)। संग्रह (संग्राहक.तोलिस्ट())'? इसके अलावा, कच्चे सूची प्रकार का उपयोग न करें। – Michael

+0

@ माइकल वास्तव में मुझे दर्शकों को लैम्ब्डा अभिव्यक्ति भाग पर ध्यान केंद्रित करने की आवश्यकता थी। इसलिए मैंने आपके द्वारा उल्लेखित बाद के जोड़ों को नहीं जोड़ा है। यह केवल एक कार्यात्मक इंटरफ़ेस में लैम्ब्डा के मैपिंग को समझने के लिए है। और कुछ नहीं। :)) –

+1

@ माइकल को आपका अंक मिला। धन्यवाद। :)) उम्मीद है कि मैंने कोड को सही किया है। –

उत्तर

8

Function कुछ ऐसा है जो X लेता है और Y देता है।

? super T  == String 
? extends R == Integer 

मूल रूप से name -> name.length() के साथ एक सार विधि R apply(T t) अधिभावी साथ @FunctionlInterface Function<T,R> को लागू कर रहे हैं।

तुम भी छोटा कर सकते हैं कि एक विधि संदर्भ में:

Stream<Integer> lengths = names.stream().map(String::length); 
2

चेक Function से apply विधि:

R apply(T t); 

? extends R वापसी प्रकार है, ? super T लिया जाता है प्रकार

Function वर्ग के रूप में केवल एक गैर-डिफ़ॉल्ट public विधि है, यह सी एक नक्शा आपके lambda Function उदाहरण

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