Kotlin中的sam(函數(shù)式接口)詳解
用lambda表達式去表示java中的匿名類實例
在使用java去給一個按鈕設(shè)置監(jiān)聽我們通常會通過創(chuàng)建匿名類實例,如下
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()
}
可以以這種方式去實現(xiàn)的原因是OnClickListener接口只有一個抽象方法,這種接口在kotlin中被當作函數(shù)式接口,或者SAM接口,SAM代表單抽象方法,類似的還有像Runnable和Callable這樣的函數(shù)式接口.
把lambda當作參數(shù)傳遞給Java方法
我們在java中定義一個
void postponeComputation(int delay,Runnable computation){
}
然后使用lambda表達式去傳遞Runnable這個參數(shù)
postponeComputation(1000){
print("hello world")
}
注意這個lambda實參編譯器會自動把它轉(zhuǎn)換成一個Runnable實例. 這種調(diào)用方式效果和顯示的實現(xiàn)一個Runnable匿名對象一樣
postponeComputation(1000,object : Runnable{
override fun run(){
println(42)
}
})
但實際不一樣的是,每次調(diào)用這種語句會重復(fù)創(chuàng)建Runnable對象,而使用lambda表達式作為實參如果沒有訪問任何來自定義它的函數(shù)變量那么只會創(chuàng)建一個對象.
如果想要完全等價需要這樣去定義
val runnable = Runaable{ println(42) }
fun handleComputation(){
postponeComputation(1000,runnable)
}
另外如果從包圍它的作用域中捕捉了變量,每次調(diào)用就不會重用同一個實例了, 如下調(diào)用每次都會使用一個新的Runnable實例.
fun handleComputation(id : String){
postponeComputation(1000){println(id)}
}
實際上從kotlin1.0起, 每個lambda都會被編譯成一個匿名類,如果lambda捕捉了變量,每個被捕捉的變量會在匿名類中有對應(yīng)的字段.
SAM構(gòu)造方法:顯式地把lambda轉(zhuǎn)換成函數(shù)式接口.
在有的方法中需要返回一個函數(shù)式接口,不能返回一個lambda, 可以用SAM構(gòu)造方法把它包裝起來. 如下
fun createAllDoneRunable() : Runnable{
return Runnable{ println(“All done”) }
}
SAM函數(shù)名稱和底層函數(shù)式接口的名稱一樣. SAM構(gòu)造方法只接收一個參數(shù)-一個被用作函數(shù)式接口單抽象方法體的lambda,并返回一個接口類的實例.
另外除了返回值通過lambda創(chuàng)建函數(shù)式接口外,也可以把lambda生成的函數(shù)式接口放在一個變量中,如下
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)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android Studio 配置:自定義頭部代碼注釋及添加模版方式
這篇文章主要介紹了Android Studio 配置:自定義頭部代碼注釋及添加模版方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android BSearchEdit 搜索結(jié)果選擇框的實例代碼
EditText搜索結(jié)果下拉框、自動or回調(diào)模式、可diy、使用超簡便。這篇文章主要介紹了Android BSearchEdit 搜索結(jié)果選擇框的實例代碼,需要的朋友可以參考下2019-10-10

