2017-02-27 10 views
7

records स्ट्रीम/संग्रह और extract फ़ंक्शन जो डेटा को इस तरह के संग्रह का एक तत्व रूपांतरित करता है।कोटलिन फ़ंक्शन संदर्भ

वहाँ Kotlin में एक तरह से स्पष्ट रूप लागू करने (it) बिना

records.map {extract(it)} 

लिखने के लिए है?

उदा। records.map(extract) या records.map {extract}

उत्तर

10
  • पर संदर्भ देता उदाहरण हैं extract कुछ T के लिए एक कार्यात्मक प्रकार (T) -> R या T.() -> R के एक मूल्य (स्थानीय चर, संपत्ति, पैरामीटर) है ले और R, तो आप इसे सीधे map पर भेज सकते हैं:

    records.map(extract) 
    

    उदाहरण:

    val upperCaseReverse: (String) -> String = { it.toUpperCase().reversed() } 
    
    listOf("abc", "xyz").map(upperCaseReverse) // [CBA, ZYX] 
    
  • हैं extract एक शीर्ष स्तर एकल तर्क समारोह या एक स्थानीय एकल तर्क समारोह है, आप कर सकते हैं make a function reference as ::extract और यह map को पारित:

    records.map(::extract) 
    

    उदाहरण :

    fun rotate(s: String) = s.drop(1) + s.first() 
    
    listOf("abc", "xyz").map(::rotate) // [bca, yzx] 
    
  • यदि यह कोई सदस्य या SomeClass कोई सदस्य या SomeClass की संपत्ति स्वीकार करने वाला कोई सदस्य या एक्सटेंशन फ़ंक्शन है, तो आप इसे SomeClass::extract के रूप में उपयोग कर सकते हैं। इस मामले में, records में SomeType के आइटम शामिल होना चाहिए, जिसका उपयोग extract के लिए एक रिसीवर के रूप में किया जाएगा।

    records.map(SomeClass::extract) 
    

    उदाहरण:

    fun Int.rem2() = this % 2 
    
    listOf("abc", "defg").map(String::length).map(Int::rem2) // [1, 0] 
    
  • Kotlin 1 के बाद से।1, अगर extract एक सदस्य या एक वर्ग SomeClass का ही विस्तार समारोह एक तर्क स्वीकार कर रहा है, तो आप कुछ रिसीवर foo साथ कर सकते हैं make a bound callable reference:

    records.map(foo::extract) 
    records.map(this::extract) // to call on `this` receiver 
    

    उदाहरण:

    listOf("abc", "xyz").map("prefix"::plus) // [prefixabc, prefixxyz] 
    

(runnable demo with all the code samples above)

1

आप विधि संदर्भ (जावा के समान) का उपयोग कर सकते हैं।

records.map {::extract} 

समारोह पर एक नज़र kotlin डॉक्स https://kotlinlang.org/docs/reference/reflection.html#function-references

+4

यह कोड वह नहीं करता है जिसका इरादा है। 'रिकॉर्ड्स' के प्रत्येक आइटम को फंक्शन संदर्भ में मैप किया जाएगा, और आपको एन समान वस्तुओं ':: निकालने' की एक सूची मिल जाएगी। – hotkey