मुझे पहले आरएक्सजेवा और कोटलिन का उपयोग करके कुछ समस्याएं थीं। मैंने कुछ रोचक खोज की हैं जिन्हें मैं अभी भी परेशान कर रहा हूं।कोटलिन उच्च-आदेश कार्यों और एकल-विधि इंटरफेस के साथ व्यवहार?
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()
विधि का उपयोग करता हूं तो यह घुंघराले ब्रैकेट { }
वाक्यविन्यास का उपयोग करके लैम्ब्डा को ठीक से ठीक करता है। लेकिन यह उपरोक्त मेरी विस्तार विधि के लिए क्यों काम नहीं करता है?