用lambda表達式去表示java中的匿名類實例 在使用java去給一個按鈕設置監聽我們通常會通過創建匿名類實例,如下

Button.setOnClickListener(new OnClickListener()){
@Override
public void onClick(View v){
Toast.makeText(this,"Hello World",Toast.LENGTH_LONG).show()
}
}

在kotlin我們可以通過傳遞一個lambda表達式去代替這個實例

btn_test.setOnClickListener { view : View ->
Toast.makeText(this,"Hello World",Toast.LENGTH_LONG).show()
}

可以以這種方式去實現的原因是OnClickListener介面只有一個抽象方法,這種介面在kotlin中被當作函數式介面,或者SAM介面,SAM代表單抽象方法,類似的還有像Runnable和Callable這樣的函數式介面.

把lambda當作參數傳遞給Java方法

我們在java中定義一個

void postponeComputation(int delay,Runnable computation){
}

然後使用lambda表達式去傳遞Runnable這個參數

postponeComputation(1000){
print("hello world")
}

注意這個lambda實參編譯器會自動把它轉換成一個Runnable實例. 這種調用方式效果和顯示的實現一個Runnable匿名對象一樣

postponeComputation(1000,object : Runnable{
override fun run(){
println(42)
}
})

但實際不一樣的是,每次調用這種語句會重複創建Runnable對象,而使用lambda表達式作為實參如果沒有訪問任何來自定義它的函數變數那麼只會創建一個對象. 如果想要完全等價需要這樣去定義

val runnable = Runaable{ println(42) }
fun handleComputation(){
postponeComputation(1000,runnable)
}

另外如果從包圍它的作用域中捕捉了變數,每次調用就不會重用同一個實例了, 如下調用每次都會使用一個新的Runnable實例.

fun handleComputation(id : String){
postponeComputation(1000){println(id)}
}

實際上從kotlin1.0起, 每個lambda都會被編譯成一個匿名類,如果lambda捕捉了變數,每個被捕捉的變數會在匿名類中有對應的欄位.

SAM構造方法:顯式地把lambda轉換成函數式介面.

在有的方法中需要返回一個函數式介面,不能返回一個lambda, 可以用SAM構造方法把它包裝起來. 如下

fun createAllDoneRunable() : Runnable{
return Runnable{ println(「All done」) }
}

SAM函數名稱和底層函數式介面的名稱一樣. SAM構造方法只接收一個參數-一個被用作函數式介面單抽象方法體的lambda,並返回一個介面類的實例. 另外除了返回值通過lambda創建函數式介面外,也可以把lambda生成的函數式介面放在一個變數中,如下

val listener = OnClickListener{
view -> val text = when(view.id){
R.id.button1 -> 「First button」
R.id.button2 -> 「Second button」
else -> 「Unknown button"
}
toast(text)
}
button1.setOnClickListener(listener)
button2.setOnClickListener(listener)

自己是從事了七年開發的Android工程師,不少人私下問我,2019年Android進階該怎麼學,方法有沒有?

沒錯,年初我花了一個多月的時間整理出來的學習資料,希望能幫助那些想進階提升Android開發,卻又不知道怎麼進階學習的朋友。【包括高級UI、性能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。

喜歡我的文章可以點贊+關注我的【個人主頁】獲取免費資料,後續我將繼續分享更多Android技術乾貨,感謝支持!

資料大全

推薦閱讀:

相关文章