2016-01-04 7 views
5

मुझे पहले आरएक्सजेवा और कोटलिन का उपयोग करके कुछ समस्याएं थीं। मैंने कुछ रोचक खोज की हैं जिन्हें मैं अभी भी परेशान कर रहा हूं।कोटलिन उच्च-आदेश कार्यों और एकल-विधि इंटरफेस के साथ व्यवहार?

RxJava

में
public interface Func1<T, R> extends Function { 
    R call(T t); 
} 

मैं एक Observable, यह भी एक RxJava वर्ग के लिए एक विस्तार विधि जोड़ने के लिए कोशिश कर रहा था सरल Func1 इंटरफेस है। यह प्रत्येक आइटम को बंद करने के लिए Func1 का उपयोग करके Google Guava ImmutableListMulitmap में उत्सर्जन एकत्र करेगा।

fun <K,T> Observable<T>.toImmutableListMultimap(keyMapper: Func1<T, K>): Observable<ImmutableListMultimap<K,T>> { 
    return this.collect({ ImmutableListMultimap.builder<K,T>()},{ b, t -> b.put(keyMapper.call(t), t)}).map { it.build() } 
} 

जब मैं इस विस्तार विधि मैं इसे संकलित करने के लिए नहीं मिल सका आह्वान करने के लिए करने की कोशिश की है, और यह सब पर लैम्ब्डा अभिव्यक्ति समझ नहीं किया गया था।

ScheduledItem.all.flatMap { it.rebuildSoftTransactions } 
.toImmutableListMultimap { it.id /*compile error */ } .cache() 

हालांकि, सबसे अजीब बात यह है कि क्या हुआ जब मैं संशोधित function type उपयोग करने के लिए विस्तार विधि।

fun <K,T> Observable<T>.toImmutableListMultimap(keyMapper: (T) -> K): Observable<ImmutableListMultimap<K,T>> { 
    return this.collect({ ImmutableListMultimap.builder<K,T>()},{ b, t -> b.put(keyMapper(t), t)}).map { it.build() } 
} 

और फिर सब कुछ ठीक संकलित। लेकिन यह मुझे परेशान करता है: कैसे लम्बा इंटरफ़ेस पर इसका अनुमान नहीं लगाया? जब मैं Observable पर मानक map() विधि का उपयोग करता हूं तो यह घुंघराले ब्रैकेट { } वाक्यविन्यास का उपयोग करके लैम्ब्डा को ठीक से ठीक करता है। लेकिन यह उपरोक्त मेरी विस्तार विधि के लिए क्यों काम नहीं करता है?

उत्तर

7

एसएएम रूपांतरण (एक लैम्ब्डा को फ़ंक्शन प्रकार में कनवर्ट करना) वर्तमान में केवल जावा में लिखे गए तरीकों के लिए काम करता है। कोटलिन के पास उचित कार्य प्रकार हैं, इसलिए एसएएम रूपांतरण की कोई आवश्यकता नहीं है - आप पैरामीटर को फ़ंक्शन प्रकार के रूप में सीधे घोषित कर सकते हैं (जो काम करता है, जैसा आपने देखा है)।

Observable.map() जावा में लिखा गया है, इसलिए एसएएम रूपांतरण लागू किया गया है। आपका एक्सटेंशन फ़ंक्शन कोटलिन में लिखा गया है, इसलिए यह नहीं है।

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