2015-12-01 11 views
8

मैं कुछ कोड है जो मुझे पढ़ने का एक सा होने के बावजूद समझने के लिए संघर्ष कर रहा हूँ का सामना करना पड़ा से बनाया जाता है। एक विधि के लिए एक कॉल है जो दो तर्कों में होता है, जिनमें से एक एक रननेबल है। एक लम्बाई वस्तु में गुजरने के बजाय हालांकि एक भेड़ का बच्चा है।कैसे Runnable Java8 लैम्ब्डा

उदाहरण के लिए: -> {}

 
public class LambdaTest { 

    private final Lock lock = new ReentrantLock(); 

    @Test 
    public void createRunnableFromLambda() { 
     Locker.runLocked(lock,() -> { 
      System.out.println("hello world"); 
     }); 
    } 

    public static class Locker { 
     public static void runLocked(Lock lock, Runnable block) { 
      lock.lock(); 
      try { 
       block.run(); 
      } finally { 
       lock.unlock(); 
      } 
     } 
    } 
} 

तो मेरे सवाल है, तो आप व्याख्या कर सकते हैं कि कैसे एक Runnable लैम्ब्डा से बनाई गई है, और यह भी कृपया कोई वाक्य रचना () समझा सकता है। विशेष रूप से,() ब्रैकेट का क्या अर्थ है?

धन्यवाद।

+3

गाइड के टन ऑनलाइन

new Runnable(){ @Override public void run(){ System.out.println("Hello world one!"); } }; 

(मैं बहुत यकीन है कि यह बाईटकोड-बराबर नहीं है, लेकिन कार्यक्षमता के मामले में बराबर है कर रहा हूँ) के बराबर * है इस। '() -> {}' '()' कार्यात्मक इंटरफेस में घोषित विधि के लिए औपचारिक मानकों का प्रतिनिधित्व करता है। '{}' उस विधि के लिए शरीर है। '-> 'पैरामीटर को शरीर से अलग करता है। –

उत्तर

24

एक लैम्ब्डा किसी भी जगह है जहां एक कार्यात्मक इंटरफ़ेस के लिए आवश्यक है में इस्तेमाल किया जा सकता है। एक कार्यात्मक इंटरफ़ेस एक सार तत्व विधि वाला कोई इंटरफ़ेस है।

लैम्ब्डा इस मामले में इस्तेमाल किया वाक्य रचना (arguments) -> {blockOfCodeOrExpression} है। एक एकल तर्क के मामले में कोष्ठक को छोड़ा जा सकता है, और एकल आदेश या अभिव्यक्ति के मामले में ब्रेसिज़ को छोड़ा जा सकता है।

दूसरे शब्दों में, () -> System.out.println("hello world"); के लिए

+5

एक कार्यात्मक इंटरफेस एक ** ** ** ** के साथ कोई इंटरफ़ेस है। चूंकि एक 'इंटरफेस' में अब 'स्थिर' या 'डिफ़ॉल्ट' विधियां हो सकती हैं, तो यह अंतर महत्वपूर्ण है। और भी विशिष्ट होने के लिए, एक कार्यात्मक इंटरफेस में बिल्कुल एक 'सार' विधि है जो 'java.lang.Object' की विधि को ओवरराइड नहीं करती है। इस प्रकार, ['तुलनाकर्ता'] (https://docs.oracle.com/javase/8/docs/api/?java/util/Comparator.html) एक 'कार्यात्मक इंटरफ़ेस' होने के बावजूद एक कार्यात्मक इंटरफेस है क्योंकि एक ओवरराइड करता है 'java.lang.Object'' विधि 'बूलियन बराबर (ऑब्जेक्ट obj) '। और इसमें बहुत से गैर-सार तत्व हैं ... – Holger

+0

धन्यवाद @ पेड्रो एफ़ोंसो - इसलिए मेरे प्रश्न का उत्तर देने के लिए,() ब्रैकेट प्रभावी ढंग से कह रहे हैं कि कोड ब्लॉक में कोई तर्क पारित नहीं किया जा रहा है। – robjwilkins

+2

_almost_ समकक्ष, लेकिन एक महत्वपूर्ण अंतर यह होता है कि यदि आप कीवर्ड में 'यह' शब्द का उपयोग करते हैं तो क्या होता है। –

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