作者:Antonio Leiva 時間:Mar 28, 2017 原文鏈接:https://antonioleiva.com/lambdas-kotlin-android/ 雖然,我在其它文章講過一點Lambda表達式,我願意更深層次解釋Kotlin中Lambda表達式是怎樣工作的,以及當我們用Ja ...
時間:Mar 28, 2017
原文鏈接:https://antonioleiva.com/lambdas-kotlin-android/
雖然,我在其它文章講過一點Lambda表達式,我願意更深層次解釋Kotlin中Lambda表達式是怎樣工作的,以及當我們用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應用程式,我建議你獲取這本免費指南,學習怎樣構建你的第一個項目,或直接購買這本書,學習怎樣從頭開始創建一個完整的應用程式。