Kotlin中的sam(函數(shù)式接口)詳解
用lambda表達(dá)式去表示java中的匿名類實(shí)例
在使用java去給一個(gè)按鈕設(shè)置監(jiān)聽我們通常會(huì)通過創(chuàng)建匿名類實(shí)例,如下
Button.setOnClickListener(new OnClickListener()){
@Override
public void onClick(View v){
Toast.makeText(this,"Hello World",Toast.LENGTH_LONG).show()
}
}
在kotlin我們可以通過傳遞一個(gè)lambda表達(dá)式去代替這個(gè)實(shí)例
btn_test.setOnClickListener { view : View ->
Toast.makeText(this,"Hello World",Toast.LENGTH_LONG).show()
}
可以以這種方式去實(shí)現(xiàn)的原因是OnClickListener接口只有一個(gè)抽象方法,這種接口在kotlin中被當(dāng)作函數(shù)式接口,或者SAM接口,SAM代表單抽象方法,類似的還有像Runnable和Callable這樣的函數(shù)式接口.
把lambda當(dāng)作參數(shù)傳遞給Java方法
我們?cè)趈ava中定義一個(gè)
void postponeComputation(int delay,Runnable computation){
}
然后使用lambda表達(dá)式去傳遞Runnable這個(gè)參數(shù)
postponeComputation(1000){
print("hello world")
}
注意這個(gè)lambda實(shí)參編譯器會(huì)自動(dòng)把它轉(zhuǎn)換成一個(gè)Runnable實(shí)例. 這種調(diào)用方式效果和顯示的實(shí)現(xiàn)一個(gè)Runnable匿名對(duì)象一樣
postponeComputation(1000,object : Runnable{
override fun run(){
println(42)
}
})
但實(shí)際不一樣的是,每次調(diào)用這種語(yǔ)句會(huì)重復(fù)創(chuàng)建Runnable對(duì)象,而使用lambda表達(dá)式作為實(shí)參如果沒有訪問任何來(lái)自定義它的函數(shù)變量那么只會(huì)創(chuàng)建一個(gè)對(duì)象.
如果想要完全等價(jià)需要這樣去定義
val runnable = Runaable{ println(42) }
fun handleComputation(){
postponeComputation(1000,runnable)
}
另外如果從包圍它的作用域中捕捉了變量,每次調(diào)用就不會(huì)重用同一個(gè)實(shí)例了, 如下調(diào)用每次都會(huì)使用一個(gè)新的Runnable實(shí)例.
fun handleComputation(id : String){
postponeComputation(1000){println(id)}
}
實(shí)際上從kotlin1.0起, 每個(gè)lambda都會(huì)被編譯成一個(gè)匿名類,如果lambda捕捉了變量,每個(gè)被捕捉的變量會(huì)在匿名類中有對(duì)應(yīng)的字段.
SAM構(gòu)造方法:顯式地把lambda轉(zhuǎn)換成函數(shù)式接口.
在有的方法中需要返回一個(gè)函數(shù)式接口,不能返回一個(gè)lambda, 可以用SAM構(gòu)造方法把它包裝起來(lái). 如下
fun createAllDoneRunable() : Runnable{
return Runnable{ println(“All done”) }
}
SAM函數(shù)名稱和底層函數(shù)式接口的名稱一樣. SAM構(gòu)造方法只接收一個(gè)參數(shù)-一個(gè)被用作函數(shù)式接口單抽象方法體的lambda,并返回一個(gè)接口類的實(shí)例.
另外除了返回值通過lambda創(chuàng)建函數(shù)式接口外,也可以把lambda生成的函數(shù)式接口放在一個(gè)變量中,如下
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)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android Studio 配置:自定義頭部代碼注釋及添加模版方式
這篇文章主要介紹了Android Studio 配置:自定義頭部代碼注釋及添加模版方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-03-03
android實(shí)現(xiàn)滑動(dòng)解鎖
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)滑動(dòng)解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
Android中實(shí)現(xiàn)可滑動(dòng)的Tab的3種方式
這篇文章主要介紹了Android中實(shí)現(xiàn)可滑動(dòng)的Tab的3種方式,需要的朋友可以參考下2014-02-02
Android實(shí)現(xiàn)帶圖標(biāo)的列表對(duì)話框
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶圖標(biāo)的列表對(duì)話框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android超詳細(xì)講解組件ScrollView的使用
本節(jié)帶來(lái)的是Android基本UI控件中的第十個(gè):ScrollView(滾動(dòng)條),或者我們應(yīng)該叫他?豎直滾動(dòng)條,對(duì)應(yīng)的另外一個(gè)水平方向上的滾動(dòng)條:HorizontalScrollView,先讓我們來(lái)了解ScrollView2022-03-03
Android BSearchEdit 搜索結(jié)果選擇框的實(shí)例代碼
EditText搜索結(jié)果下拉框、自動(dòng)or回調(diào)模式、可diy、使用超簡(jiǎn)便。這篇文章主要介紹了Android BSearchEdit 搜索結(jié)果選擇框的實(shí)例代碼,需要的朋友可以參考下2019-10-10

