2017-09-19 41 views
7

में ऑनक्लिक लिस्टनर विधियों के बीच अंतर मैं कोटलिन सीख रहा हूं। इससे पहले, मैंने एंड्रॉइड डेवलपमेंट के लिए जावा के साथ काम किया है। कोटलिन सीखने के लिए एक महान भाषा है। जब मैं setOnClickListener(View.OnClickListener) का उपयोग कर रहा था तो मुझे भ्रम है। मैंने एंड्रॉइड स्टूडियो पर दो संकेत देखे हैं।कोटलिन

image

मैं कैसे काम करते हैं या उन दोनों को परिभाषित करने के लिए पता है।

OnClickListerner

send_button.setOnClickListener(object : View.OnClickListener{ 
     override fun onClick(p0: View?) { 
      TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 
     } 
    }) 

को लागू करने के लिए पहला तरीका है और इस मैं जहाँ तक समझ में के रूप में दूसरी विधि लैम्ब्डा पर आधारित है OnClickListener

send_button.setOnClickListener { 
     TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 
    } 

को लागू करने की दूसरा तरीका है। लेकिन मुझे इन तरीकों की उचित समझ नहीं हो सकती है।

तो, मेरा सवाल है: उन तरीकों के बीच क्या अंतर है? यदि वे भिन्न हैं, तो कौन सा बेहतर है और क्यों?

उत्तर

2

वे एक ही समारोह का उल्लेख लेकिन अलग तरह से लिखा जाता है। पहला setOnClickListener() फ़ंक्शन का आह्वान करने का एक सामान्य तरीका है जो OnClickListener ऑब्जेक्ट स्वीकार करता है।

दूसरा दूसरा लैम्ब्डा अभिव्यक्ति का उपयोग करता है। यह काम करता है क्योंकि View.OnClickListener जावा में परिभाषित SAM type है और कोटलिन SAM conversions का समर्थन करता है।

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

मान लीजिए आप एक इंटरफेस इस तरह जावा में परिभाषित किया गया है:

public class Example { 
    public interface SingleMethodInterface { 
     int length(String text); 
    } 

    public static void set(SingleMethodInterface sam) {} 
} 

उसके बाद, आप Kotlin में निम्नलिखित दो तरीकों से set() फ़ंक्शन को कॉल कर सकते हैं:

//Passing a function type which accept a `String` and return an `Int` 
val length: (String) -> Int = { it.length } 
Example.set(length) 
//or 
Example.set { it.length } 

//Passing an object which implements `SingleMethodInterface` 
val length2: Main.SingleMethodInterface = object: Main.SingleMethodInterface { 
    override fun length(text: String): Int { 
     return text.length 
    } 
} 
Example.set(length2) 

संक्षेप में, सैम रूपांतरण कोटलिन में क्लीन कोड लिखने का एक तरीका प्रदान करता है जो जावा के साथ इंटरऑप करता है।

+0

अच्छी जानकारी आदमी, लेकिन आपका उदाहरण उनके प्रश्न के लिए प्रासंगिक नहीं है। –

+0

@ भुवनेश बीएस मैंने जो उदाहरण जोड़ा है वह एसएएम रूपांतरण की व्याख्या करने के लिए प्रयोग किया जाता है। – BakaWaii

+1

इस अच्छी जानकारी @ बाकावाई साझा करने के लिए धन्यवाद। – UltimateDevil

3

आपका प्रश्न: उन तरीकों के बीच क्या अंतर है? यदि वे भिन्न हैं, तो कौन सा बेहतर है और क्यों?

संकलन के बाद, दोनों एक ही बाइटकोड उत्पन्न करेंगे लेकिन इसे लिखते समय आपको एकल लाइन कार्यान्वयन से अधिक पठनीयता मिल जाएगी।

जावा 8 की शानदार विशेषता लैम्ब्डा अभिव्यक्ति है। लैम्ब्डा के साथ आप जावा कोड को सरल लिख सकते हैं। कोड की बदसूरत रूप इस सुविधा से थोड़ा बदल गई।

उदाहरण: source

आप एकल सार विधि (एसएएम) लैम्ब्डा के रूप में लिख सकते हैं।

यदि आपके इंटरफ़ेस में केवल एक ही विधि है।

public interface StateChangeListener { 

    public void onStateChange(State oldState, State newState); 

} 

आप इसे लैम्ब्डा के रूप में लिख सकते हैं।

stateOwner.addStateListener(
    (oldState, newState) -> System.out.println("State changed") 
); 

लेकिन तरीकों में से दोनों एक ही हैं, लेकिन आप देख सकते हैं दूसरा एक बहुत आसान है और बदसूरत कार्यान्वयन हटा दिया।

कोटलिन में, लैम्ब्डा अभिव्यक्ति जावा से अलग हैं।

Kotlin लैम्ब्डा अभिव्यक्ति उदाहरण: source

val add: (Int, Int) -> Int = { a, b -> a + b } 

ऊपर समारोह चर इस तरह कहा जा सकता है:

val addedValue: Int = add(5, 5) 

यह आपको दो पूर्णांकों का जोड़ा मान प्रदान करेंगे।

इस उदाहरण में आप (Int, Int) -> Int देख सकते हैं, इसे कोटलिन में लैम्ब्डा फ़ंक्शन कहा जाता है।

तो कोटलिन लैम्ब्डा और जावा लैम्ब्डा फ़ंक्शन पूरी तरह से अलग हैं।

आप Kotlin डॉक्स में देख सकते हैं:

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

वास्तव में, आप कोटलिन में लैम्ब्डा लिख ​​रहे हैं, बाद में इसे जावा इंटरफ़ेस में परिवर्तित कर दिया जाएगा। तो दोनों विधियां अलग हैं। लेकिन जब निष्पादन की बात आती है तो दोनों समान होते हैं। यह संकलन समय को प्रभावित नहीं करेगा, इसलिए हमेशा लैम्ब्डा का उपयोग करने का सुझाव दिया जाता है।

आशा है कि यह मदद करता है :)

+0

उन्होंने लैम्ब्डा विधि और सामान्य विधि के बीच अंतर के लिए कहा। कृपया उत्तर दें IIntellij Amiya –

+1

धन्यवाद, आपके उत्तर के लिए @IntelliJAmiya। यह मुझे समझने में बहुत मदद करता है। setOnClickListener रूपांतरण – UltimateDevil