2013-01-22 27 views
13

मैं Clojure में पुस्तकालयों कि उच्च आदेश कार्यों कि "clojure.lang.IFn" इंटरफेस के अनुरूप उत्पादन के एक नंबर का उपयोग करें।क्या मैं जावा 8 में लैम्ब्डास के रूप में क्लोजर फ़ंक्शंस का उपयोग करने में सक्षम हूं?

यह कई arity भार के, यानी है

public interface IFn extends Callable, Runnable{ 
    public Object invoke() ; 
    public Object invoke(Object arg1) ; 
    public Object invoke(Object arg1, Object arg2) ; 
    public Object invoke(Object arg1, Object arg2, Object arg3) ; 
    .... etc. 
    public Object applyTo(ISeq arglist) ; 
} 

मैं जावा 8 के रूप में प्रतिदेय लैम्ब्डा कार्यों में सीधे इस प्रकार की वस्तुओं का उपयोग करने में सक्षम होंगे: इंटरफेस कुछ की तरह लग रहा है?

+5

IIRC, जावा 8 नहीं करता आप "कहते हैं" किसी भी नए तरीके से लैम्ब्डा कार्य; यह केवल _create_ lambda कार्यों के लिए नए तरीके प्रदान करता है, जो एकल-फ़ंक्शन इंटरफेस होना चाहिए। –

उत्तर

7

आपका क्या मतलब है, इस प्रकार के प्रतिदेय lambdas के रूप में के उपयोग की वस्तुओं?

बहुत सरल मामलों में, जावा 8 lambdas वाक्यात्मक चीनी + इंटरफेस, अर्थात् कार्यात्मक इंटरफेस[1] के कुछ प्रकार के लिए गुमनाम वर्गों के लिए कुछ प्रकार निष्कर्ष के रूप में सोचा जा सकता है:

इंटरफ़ेस ऊपर इस्तेमाल किया गया एक्शन लिस्टनर, केवल एक विधि है। कई आम कॉलबैक इंटरफेस ऐसे Runnable और तुलनाकारी के रूप में इस संपत्ति, की है। हम सभी इंटरफेस देंगे जिनके पास केवल एक विधि है नाम: कार्यात्मक इंटरफेस।

टिप्पणी: लैम्बडा वास्तव में सिर्फ एक चीनी नहीं है; आंतरिक रूप से वे अज्ञात वर्गों से भिन्न रूप से लागू होते हैं, और कुछ अर्थपूर्ण अंतर भी होते हैं; इस मामले पर अधिक के लिए प्रोग्रामर एक्सचेंज पर this excellent answer देखें। हालांकि, यह इस प्रश्न और उत्तर के संदर्भ में वास्तव में महत्वपूर्ण नहीं है।

कहीं भी जहां कुछ कार्यात्मक इंटरफ़ेस का मान अपेक्षित है (विधि तर्क, स्थानीय चर, फ़ील्ड घोषणा आदि) इस विधि को कार्यान्वित करने वाले अज्ञात वर्ग के समान इकाई बनाने के लिए शॉर्ट सिंटैक्स का उपयोग करना संभव होगा, यानी लैम्ब्डा अभिव्यक्ति:

Runnable r =() -> { 
    System.out.println("Hi"); 
}; 
// Equivalent to 
Runnable r = new Runnable() { 
    public void run() { 
     System.out.println("Hi"); 
    } 
}; 

public interface Function<F, T> { 
    T call(F arg); 
} 

Function<String, char[]> c = s -> ("<" + s + ">").toCharArray(); 
// Equivalent to 
Function<String, char[]> c = new Function<>() { 
    public char[] call(String s) { 
     return ("<" + s + ">").toCharArray(); 
    } 
}; 

तो अपने प्रश्न केवल निम्नलिखित तरीके से व्याख्या की जा सकती है: यह जावा 8 लैम्ब्डा सिंटैक्स का उपयोग प्रकार IFn की वस्तुओं को बनाने के लिए संभव है?

उत्तर नहीं है। लैम्ब्डा सिंटैक्स केवल कार्यात्मक इंटरफेस के साथ संभव है। clojure.lang.IFn एक कार्यात्मक इंटरफ़ेस है, क्योंकि यह एक विधि की तुलना में अधिक होता है नहीं है, तो यह

IFn f = (String s) -> s.toLowerCase(); 
+5

यह विचार कि जावा 8 लैम्बडा अज्ञात आंतरिक कक्षाओं पर वाक्य रचनात्मक चीनी हैं, एक ज्ञापन है जो अभी नहीं चलेगा। इस प्रश्न के उत्तर देखें: http://programmers.stackexchange.com/questions/177879/type-inference-in-java-8, यह गलत होने के स्पष्टीकरण के लिए। यह स्पष्ट रूप से एक लगातार सवाल होने जा रहा है; मैं लैम्ब्डा पूछे जाने वाले प्रश्न (http://www.lambdafaq.org) –

+0

@MauriceNaftalin पर एक जवाब डाल देता हूँ, धन्यवाद, मैं जाना चाहिए था लैम्ब्डा कल्पना अधिक अच्छी तरह से पढ़ रहा। मैं इसके बारे में एक नोटिस जोड़ रहा हूँ। –

+1

प्रश्न की मेरी व्याख्या यह है कि आप यहां क्या मिला है इसके विपरीत है।मुझे लगता है कि वह क्लोजर फ़ंक्शंस पास करना चाहता है, जो ऑब्जेक्ट्स IFn को कार्यान्वित करने वाली ऑब्जेक्ट्स हैं, जावा फ़ंक्शंस में जो एक ऑब्जेक्ट को उनके एकल फ़ंक्शन इंटरफ़ेस को कार्यान्वित करने की अपेक्षा करता है। मुझे संदेह है कि जवाब नहीं है। – bfabry

2

नहीं की तरह कुछ करने के लिए संभव नहीं होगा, ऐसा लगता है आप clojure कार्यों का उपयोग नहीं कर सकते हैं जैसे कि वे भी वैध जावा हैं lambdas। क्लोजर का आईएफएन परिभाषित के रूप में जावा के "लैम्ब्डा" कार्यात्मक इंटरफेस के अनुरूप नहीं है।