Lambda表達式在Kotlin中怎樣工作的:setOnClickListener的轉換(KAD 18)


作者:Antonio Leiva

時間:Mar 28, 2017

原文鏈接:https://antonioleiva.com/lambdas-kotlin-android/

 

 

雖然,我在其它文章講過一點Lambda表達式,我願意更深層次解釋KotlinLambda表達式是怎樣工作的,以及當我們用Java庫時,他們是怎樣以Lambda表達式的單一方法轉換接口。

 

特別是我要給出一些例子解釋怎樣簡化Android框架的用法,我們還將詳細看到Android視圖的setOnClickListener

 

SetOnClickListener轉換

 

我最喜歡Kotlin特性之一就是由於有了一些約定它簡化Android框架的工作

 

 

例如,setOnClickListener函數,在Java中時這樣定義的:

1 public void setOnClickListener(OnClickListener l) {
2    ...
3 }

 

而在Kotlin中我們使用它時,可以這樣:

1 fun setOnClickListener(l: (View) -> Unit)

 

這節省我們必須創建接口的一個匿名實現,極大地簡化了UI組件的初始化工作。

 

SetOnclickListener原本方法

 

 

依照上面,我們已經節省了足夠的代碼了,就是我們原必須創建OnClickListener的匿名類:

1 view.setOnClickListener(object : View.OnClickListener {
2     override fun onClick(v: View?) {
3         toast("Hello")
4     }
5 })

 

不過你將看到編輯器直接給你的警告,建議你用Lambda方法。

 

你能夠做的轉換:

 

1 view.setOnClickListener({ v -> toast("Hello") })

 

 

簡單,對吧?但是,這還能更進一步簡化。

 

 

如果函數的最后一個參數是函數,它能夠移到圓括號外面。

 

 

因此,我們能夠按此提取偵聽器:

 

1 view.setOnClickListener() { v -> toast("Hello") }

 

 

如果我們有多個參數,其余的參數則在圓括號內,即使這些參數是函數。僅僅最后一個參數能夠提出來。

 

 

如果函數僅有一個參數,且它是一個函數,則圓括號能刪除

 

 

而不是留着空的圓括號,我們最好刪除這空的圓括號:

 

1 view.setOnClickListener { v -> toast("Hello") }

 

 

這就構成了代碼塊。在這種方法下,我們能夠定義我們自己的模型語言DSL

 

一個非常典型的例子是Kotlin參考頁面,他們構件DSL通過代碼創建HTML

 

如果你不用Lambda參數,你可以刪除函數的左邊部分

 

如果你僅有一個參數這是正確。不使用視圖(v),就可以刪除它:

1 view.setOnClickListener { toast("Hello") }

 

另外,在函數僅接收參數,則不是在左邊定義,而是用保留字it,節省一些字符。

 

例如,如果我們用視圖傳遞它到另一個方法:

 

1 view.setOnClickListener { v -> doSomething(v) }

 

 

我們可以選擇簡單的用it

1 view.setOnClickListener { doSomething(it) }

 

Lambda表達式,你的朋友

 

你見到的這些代碼的不同之處是非常重要的。這不僅為你節省了字符(約70%),還極大地提高了代碼的可讀性

 

 

我們只編寫真正重要的代碼,而跳過那些並沒有多大用處的代碼。

 

 

如果你想進一步學習更多這些知識,能夠非常流利創建自己的Android應用程序,我建議你獲取這本免費指南,學習怎樣構建你的第一個項目,或直接購買這本書,學習怎樣從頭開始創建一個完整的應用程序。

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM