2009-05-30 16 views
22

क्या कोई मुझे बता सकता है कि जावा में पाइथन के लैम्ब्डा फ़ंक्शंस के बराबर है या नहीं?जावा में पाइथन के लैम्ब्डा कार्यों के लिए समतुल्य?

+0

पांच साल बाद, जावा 8 ने लैम्बडा एक्सप्रेशन को भाषा सुविधा के रूप में जोड़ा है और थोक डेटा ऑपरेशंस से निपटने के लिए एक नया स्ट्रीम एपीआई जोड़ा है। काफी समझ नहीं है, लेकिन अभी भी उपयोगी है। –

+0

इसे देखें: [जावा 8 लैम्बडास क्लोजर हैं?] (Http://bruceeckel.github.io/2015/10/17/are-java-8-lambdas-closures/) –

उत्तर

9

मुझे नहीं लगता कि वहां एक सटीक समतुल्य है, हालांकि अज्ञात वर्ग हैं जो आप जितना करीब प्राप्त कर सकते हैं। लेकिन अभी भी बहुत अलग है। जोएल स्पॉस्की ने एक लेख लिखा कि छात्रों ने केवल जावा सिखाया कि कैसे कार्यात्मक शैली प्रोग्रामिंग की इन सुंदरियों पर गायब हैं: Can Your Programming Language Do This?

28

दुर्भाग्यवश, जावा में कोई लैम्बडा नहीं है। ,

interface MyLambda { 
    void theFunc(); // here we define the interface for the function 
} 

public class Something { 
    static void execute(MyLambda l) { 
     l.theFunc(); // this class just wants to use the lambda for something 
    } 
} 

public class Test { 
    static void main(String[] args) { 
     Something.execute(new MyLambda() { // here we create an anonymous class 
      void theFunc() {    // implementing MyLambda 
       System.out.println("Hello world!"); 
      } 
     }); 
    } 
} 

जाहिर है इन अलग फ़ाइलों :(

+1

लैम्ब्डा एक मूल्य ले सकता है और वापस कर सकता है । आप कॉल करने योग्य की तरह कुछ और चाहते हैं। – Dustin

+1

पैरामीटर स्वीकार करने और मूल्यों को वापस करने में सक्षम होने के अलावा, लैम्ब्डा भी उन परिभाषाओं में स्थानीय चर का उपयोग कर सकते हैं जिन्हें वे परिभाषित किए गए थे।जावा में, अज्ञात कक्षाएं उन चर के चर में अंतिम चर का उपयोग कर सकती हैं, जिन्हें परिभाषित किया गया था, जो कि समान है। ओटीओएच, कुछ कॉल करने योग्य को लागू करने के लिए यह एक अच्छा विचार हो सकता है। – gooli

+0

एक छोटा सा क्विबल: 'माईलांबडा' को एक अलग फ़ाइल में नहीं होना चाहिए; आप इसे 'कुछ' के आंतरिक, सार्वजनिक, स्थैतिक इंटरफ़ेस के रूप में घोषित कर सकते हैं। –

1
Zifre के लिए कुछ हद तक इसी तरह

में होना चाहिए था आप: हालांकि, अगर आप गुमनाम वर्गों के साथ लगभग ही प्रभाव (एक बहुत बदसूरत तरीके से) प्राप्त कर सकते हैं एक अंतरफलक बना सकते हैं इस प्रकार

public interface myLambda<In, Out> { 
    Out call(In i); 
} 

आप लिखने के लिए सक्षम करने के लिए कहते हैं,

Function<MyObj, Boolean> func = new Function<MyObj, Boolean>() { 
    public Boolean callFor(myObj obj) { 
     return obj.canDoStuff(); 
    }; 

MyObj thing = getThing; 

if (func.callFor(thing)) { 
    doSomeStuff(); 
} else { 
    doOtherStuff(); 
} 

यह अभी भी थोड़ा सा है, लेकिन इसमें कम से कम इनपुट/आउटपुट है।

+0

मुझे लगता है कि आप उस दूसरे कोड स्निपेट के लाइन 5 पर एक ब्रैकेट खो रहे हैं। मैंने इसे खुद जोड़ने की कोशिश की, लेकिन स्टैक ओवरफ्लो मुझे लंबाई में केवल 1 वर्ण के संशोधन करने नहीं देगा। – falsePockets

0

हां,

जावा में जावा में लैम्ब्डा अभिव्यक्तियां पेश की गई हैं। लैम्ब्डा भाव के लिए

बेसिक वाक्य रचना कर रहे हैं:

(parameters)-> 
{ 
    statements; 
} 

उदाहरण

(String s)-> 
{ 
System.out.println(s); 
} 

चेक इस लिंक:

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

0

की रिहाई जावा 8, lambda- के साथ अभिव्यक्ति एन है ओउ उपलब्ध और जावा में लैम्ब्डा फ़ंक्शन वास्तव में अजगरों की तुलना में "अधिक शक्तिशाली" है।

पायथन में, लैम्ब्डा-अभिव्यक्ति में केवल उसके शरीर के लिए एक अभिव्यक्ति हो सकती है, और return कथन की अनुमति नहीं है। जावा में, आप ऐसा कुछ कर सकते हैं: (int a, int b) -> { return a * b; }; और अन्य वैकल्पिक चीजें भी।

जावा 8 Function Interface नामक एक और इंटरफेस भी पेश करता है। आप इसे भी देखना चाहेंगे।

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