2015-10-30 24 views
11

कभी कभी मैं नीचे दिए गए उदाहरण में दूसरा पैरामीटर है, जो एक परिवर्तन घटना में एक पुराने मूल्य है की तरह सभी लैम्ब्डा पैरामीटर का उपयोग नहीं करते हैं,? कारण कि clutters कोड और पठनीयता दर्द होता है। इससे पहले मैं विधि का इस्तेमाल किया इसके बाद के संस्करण, लेकिन kotlin में 1.0.0 बीटा-1103 अंडरस्कोर आरक्षित हैं।कैसे Kotlin में लैम्ब्डा पैरामीटर छोड़ देते हैं?</p> <pre><code>selected.onChange { value, _ -> checkBox.isChecked = value } </code></pre> <p>मैं उन्हें कैसे छोड़ देते:

+5

वर्तमान में आप अगर आप अक्सर लैम्ब्डा का उपयोग नहीं कर सकते हैं – Yaroslav

+4

एक नया इसी त्वरित सुधार है पर्याप्त इस वारंट, तो आप हमेशा एक विस्तार समारोह है कि मानकों को आप निकालना नहीं चाहते के साथ एक ही बात करता है जोड़ सकते हैं। – eski

उत्तर

5

1,1 के रूप में, आपको लगता है कि वास्तव में कर सकते हैं: (1.1 के बाद से) अप्रयुक्त चर के लिए

अंडरस्कोर

हैं लैम्ब्डा पैरामीटर अप्रयुक्त है, तो आप एक अंडरस्कोर बजाय जगह कर सकते हैं जैसा कि इसके नाम का :

map.forEach { _, value -> println("$value!") } 

https://kotlinlang.org/docs/reference/lambdas.html#underscore-for-unused-variables-since-11

मैं जोड़ने चाहिए कि संकलक अब अप्रयुक्त लैम्ब्डा पैरामीटर के लिए एक चेतावनी उत्पन्न करता है, और वहाँ के लिए एंड्रॉयड स्टूडियो

4

आप escaping for Java identifiers that are keywords in Kotlin (यानी बैकटिक्स) या ओवरलोड onChange का उपयोग कर सकते हैं।

बैकटिक

selected.onChange { value, `_` -> 
    checkBox.isChecked = value 
} 

अधिभार onChange

interface Listener<T1, T2> { 
    fun onChange(f: (T1, T2) -> Unit) // original method 
    fun onChange(f: (T1) -> Unit)  // new method 
} 

और अगर आप Listener<T1, T2> नहीं बदल सकते हैं (या जो भी प्रकार settable अपने उदाहरण से है) तो आप एक extension function उपयोग कर सकते हैं:

fun <T1, T2> Listener<T1, T2>.onChange(f: (T1) -> Unit) = onChange { t1, t2 -> f(t1) } 

फिर आप onChange कॉल कर सकते हैं आप की तरह हैं:

selected.onChange { value -> 
    checkBox.isChecked = value 
} 
संबंधित मुद्दे