2017-08-17 14 views
11

के साथ घुंघराले ब्रेसिज़ और सामान्य ब्रैकेट के बीच क्या अंतर है, मैं आरएक्सजेवा का उपयोग करते समय घुंघराले ब्रेसिज़ और कोटलिन में सामान्य ब्रैकेट के बीच वास्तविक अंतर को समझ नहीं पा रहा हूं। उदाहरण के लिए, मैं निम्नलिखित कोड है जो अपेक्षा के अनुरूप काम करता है:आरएक्सजेवा में कोर्लिन

someMethodThatReturnsCompletable() 
    .andThen(anotherMethodThatReturnsACompletable()) 
    .subscribe(...) 

लेकिन निम्नलिखित काम नहीं करता:

someMethodThatReturnsCompletable() 
    .andThen { anotherMethodThatReturnsACompletable() } 
    .subscribe(...) 

नोट घुंघराले ब्रेसिज़ के साथ श्रृंखला के andThen() भाग में अंतर। मैं समझ नहीं पा रहा हूं कि दोनों के बीच क्या अंतर है। मैंने कुछ लेखों पर एक नज़र डाली है लेकिन दुर्भाग्य से मुझे अभी भी इस सूक्ष्म अंतर को समझने में कठिनाई हो रही है।

+0

मेरा प्रश्न व्यवहार के बारे में नहीं है - लेकिन दोनों ब्रेसिज़ के बीच का अंतर - इस उदाहरण में वे कैसे/अलग क्यों हैं? – blackpanther

उत्तर

5

पहले कोड खंड anotherMethodThatReturnsACompletable() कार्यान्वित करने के लिए पारित हो जाएगा और करने के लिए दिया गया मान गुजरता andThen(), जहां Completable पैरामीटर के रूप में स्वीकार किया जाता है।

दूसरे कोड सेगमेंट में, आप lambda expression के रूप में एक फ़ंक्शन शाब्दिक लिख रहे हैं। यह () -> UnitandThen() के एक फ़ंक्शन को पास करता है, जो यह एक वैध कथन भी है, लेकिन लैम्ब्डा के अंदर कोड को नहीं कहा जा सकता है।

lock (lock) { 
    sharedResource.operation() 
} 
:

Kotlin में, वहाँ एक परंपरा है कि यदि एक समारोह के लिए पिछले पैरामीटर एक समारोह है, और आप इसी तर्क के रूप में एक लैम्ब्डा अभिव्यक्ति गुजर रहे हैं, तो आप इसे कोष्ठकों के बाहर निर्दिष्ट कर सकते हैं

Kotlin समर्थन SAM conversion, के बाद से

इसका मतलब है कि Kotlin समारोह शाब्दिक स्वचालित रूप से जावा इंटरफेस के कार्यान्वयन में बदला जा सकता एक गैर-डिफ़ॉल्ट विधि के साथ, जब तक इंटरफ़ेस विधि के पैरामीटर प्रकार कोटलिन फ़ंक्शन के पैरामीटर प्रकार से मेल खाते हैं।

वापस Completable को देखते हुए, वहाँ कई अतिभारित andThen() कार्य हैं:

andThen(CompletableSource next) 
andThen(MaybeSource<T> next) 
andThen(ObservableSource<T> next) 
andThen(org.reactivestreams.Publisher<T> next) 
andThen(SingleSource<T> next) 

यहाँ आप फोन करके सैम प्रकार निर्दिष्ट कर सकते हैं:

andThen(CompletableSource { 
    //implementations 
}) 
1

.andThen(anotherMethodThatReturnsACompletable()) मतलब यह है कि anotherMethodThatReturnsACompletable() का परिणाम andThen()

.andThen { anotherMethodThatReturnsACompletable() } को दे दिया जाएगा मतलब है कि लैम्ब्डा, कि anotherMethodThatReturnsACompletable() कार्यान्वित andThen()

3

कि आप जानते ही हैं कि जावा () में ब्रैकेट का उपयोग पैरामीटर पास करने के लिए किया जाता है और {} विधि शरीर के लिए ब्रेसिज़ का उपयोग किया जाता है और लैम्ब्डा अभिव्यक्ति के शरीर का भी प्रतिनिधित्व करता है।

तो देता है की तुलना:

  1. .andThen(anotherMethodThatReturnsACompletable()): यहाँ andthen() विधि को स्वीकार करता है Completable तो andthen completable anotherMethodThatReturnsACompletable() विधि द्वारा वापस बाद में सदस्यता के लिए के संदर्भ में बचत होगी।

  2. .andThen { anotherMethodThatReturnsACompletable() }: यह लैम्ब्डा अभिव्यक्ति को और फिर विधि में पास करता है। लैम्ब्डा पास करने के समय यहां anotherMethodThatReturnsACompletable() नहीं बुलाया गया है। anotherMethodThatReturnsACompletable() को तब कॉल किया जाएगा जब लैम्ब्डा फ़ंक्शन को और फिर विधि में बुलाया जाता है।

उम्मीद है कि यह मदद करता है।

0

() -> आप उन्हें अंदर कुछ गुजर जाता है, यानी समारोह तर्क

{} -> आप उन्हें अंदर कुछ को क्रियान्वित कर रहे हैं। यानी अभिव्यक्ति

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