2014-09-05 11 views
5

मैं जावा 8 सुविधाओं का उपयोग करने की कोशिश कर रहा हूं। official tutorial पढ़ते समय मैं इस कोडजावा 8 काम में यह लैम्ब्डा सुविधा कैसे है?

static void invoke(Runnable r) { 
    r.run(); 
} 

static <T> T invoke(Callable<T> c) throws Exception { 
    return c.call(); 
} 

में आए और एक सवाल था:

जो विधि निम्नलिखित बयान में लागू किया जाएगा "

String s = invoke(() -> "done");

और इसका उत्तर

था 210

विधि invoke(Callable<T>) लागू की जाएगी क्योंकि यह विधि एक मान देता है; विधि invoke(Runnable) नहीं है। इस मामले में, लैम्ब्डा अभिव्यक्ति () -> "done" का प्रकार Callable<T> है।

मैं invoke के बाद से समझते हैं के रूप में एक String लौटने की उम्मीद है, यह प्रतिदेय का आह्वान कहता है। लेकिन, यह सुनिश्चित नहीं है कि यह वास्तव में कैसे काम करता है।

+1

मैंने आपके प्रश्न को थोड़ा बदल दिया (अधिक जानकारी और ट्यूटोरियल से लिंक जोड़ने के लिए)। अगर आपको लगता है कि मैंने अपना संपादन रोलबैक करने के लिए बहुत ज्यादा महसूस किया है। – Pshemo

+0

@Pshemo संपादन के लिए धन्यवाद। मैं यही पूछना चाहता था। –

उत्तर

11

के लैम्ब्डा

invoke(() -> "done"); 

सच है कि आप केवल

"done" 

लैम्ब्डा मूल्य संगत बनाता है पर एक नज़र डालते हैं। लैम्ब्डा का शरीर है, जो एक निष्पादन योग्य बयान होने के लिए प्रकट नहीं होता है, परोक्ष

{ return "done";} 

अब हो जाता है, के बाद से Runnable#run() एक वापसी मूल्य नहीं है और Callable#call() करता है, बाद चुना जाएगा।

आप

invoke(() -> System.out.println()); 

बजाय, लैम्ब्डा प्रकार Runnable का एक उदाहरण का संकल्प किया जाएगा लिखा था, के बाद से वहाँ कोई अभिव्यक्ति है कि एक वापसी मान इस्तेमाल किया जा सकता है कहते हैं।

+0

जो सत्य नहीं है, वापसी प्रकार यहां विधि निर्धारित करने में मदद नहीं करता है, 'void' से 'स्ट्रिंग' तक वापसी प्रकार बदलें और –

+0

@jigar जांचें यदि वे अपने प्रश्न को केवल' invoke (() ->" "); 'कोई असाइनमेंट के साथ, मैं सहमत होगा। –

+0

इस http://pastebin.com/SyhNszUv –

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