2012-01-18 10 views
5

मैंने http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html पढ़ा है और देखा है कि सभी उदाहरणों में स्पष्ट रूप से घोषित तर्क प्रकार है, भले ही यह इंटरफ़ेस-फ़ंक्शन घोषणा से पहले से ही ज्ञात हो।जावा 8 लैम्बडा सिंटैक्स में तर्क प्रकार निर्दिष्ट करने के लिए कोई कारण हैं?

public interface FileFilter { 
    /** ... **/ 
    boolean accept(File pathname); 
} 


FileFilter java = (File f) -> f.getName().endsWith(".java"); 

हम सिर्फ

(f) -> f.getName().endsWith(".java"); ? 

अद्यतन साथ जाना नहीं कर सकते: JSR-335 Draft में, मैं ने पाया है कि अनुमान लगाया-प्रकार पैरामीटर सबसे

(int x) -> x+1 // Single declared-type parameter 
(int x) -> { return x+1; } // Single declared-type parameter 
(x) -> x+1 // Single inferred-type parameter 
x -> x+1 // Parens optional for single inferred-type case 
+1

कारण यह है कि उदाहरण के सबसे प्रकट पैरामीटर प्रकार इस्तेमाल किया में छोड़ दिया जाता है है, भले ही टाइप अनुमान 1 दिन से माना जाता था, पूरी तरह से शैक्षिक है। दर्शकों को सामान्य जावा डेवलपर्स माना जाता था जिन्होंने पहले इस सामग्री में से कोई भी नहीं देखा है; भेड़ के बच्चे को फेंकना * और * एक बार में उनके प्रकार का अनुमान लेना बहुत कुछ होता। –

उत्तर

3

वहाँ एक उदाहरण है जहां प्रकार "4. लक्ष्य टाइपिंग" खंड

Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2); 
0

समर्थित होने की संभावना है मुझे कल्पना है कि यह इस बात पर निर्भर करता है कि यह किस प्रकार के प्रकार को जानता है।

जावा 7 में, = के दाईं ओर वाले कोड को पता नहीं है कि अभिव्यक्ति का उपयोग कैसे किया जाना चाहिए। संकलन के लिए इसे प्राप्त करने के लिए कंपाइलर के लिए एक डिज़ाइन परिवर्तन की आवश्यकता है।

सिद्धांत में आपको परिवर्तनीय घोषणा की भी आवश्यकता नहीं है क्योंकि यह माता-पिता में निर्दिष्ट है या इसका निहित किया जा सकता है।

FileFilter java = (File f) -> f.getName().endsWith(".java"); 

हो सकता है

FileFilter java = -> pathname.getName().endsWith(".java"); 

या एक गर्भित गेटर के साथ।

FileFilter java = -> pathname.name.endsWith(".java"); 

या आप मान सकते हैं कि पैरामीटर नाम स्थान पर आयात किए गए हैं क्योंकि केवल एक पैरामीटर है। (जैसा एसक्यूएल स्तंभ नाम के साथ करता है)

FileFilter java = -> name.endsWith(".java"); 
संबंधित मुद्दे

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