亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Kotlin中的sam(函數(shù)式接口)詳解

 更新時(shí)間:2019年03月17日 11:00:06   作者:Android架構(gòu)  
這篇文章主要介紹了Kotlin中的sam(函數(shù)式接口)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

用lambda表達(dá)式去表示java中的匿名類實(shí)例

在使用java去給一個(gè)按鈕設(shè)置監(jiān)聽(tīng)我們通常會(huì)通過(guò)創(chuàng)建匿名類實(shí)例,如下

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

在kotlin我們可以通過(guò)傳遞一個(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í)參如果沒(méi)有訪問(wèn)任何來(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í)例.

另外除了返回值通過(guò)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)文章

  • Ubutu1604安裝colmap實(shí)現(xiàn)方法詳細(xì)教程

    Ubutu1604安裝colmap實(shí)現(xiàn)方法詳細(xì)教程

    這篇文章主要介紹了Ubutu1604安裝colmap實(shí)現(xiàn)方法詳細(xì)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Android Hilt依賴注入的使用講解

    Android Hilt依賴注入的使用講解

    這篇文章主要介紹了Android Hilt依賴注入的使用,首先,某個(gè)類的成員變量稱為依賴,如若此變量想要實(shí)例化引用其類的方法,可以通過(guò)構(gòu)造函數(shù)傳參或者通過(guò)某個(gè)方法獲取對(duì)象,此等通過(guò)外部方法獲取對(duì)象實(shí)例的稱為依賴注入
    2023-01-01
  • Android 使用地圖時(shí)的權(quán)限請(qǐng)求方法

    Android 使用地圖時(shí)的權(quán)限請(qǐng)求方法

    今天小編就為大家分享一篇Android 使用地圖時(shí)的權(quán)限請(qǐng)求方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Android實(shí)現(xiàn)EditText圖文混合插入上傳功能

    Android實(shí)現(xiàn)EditText圖文混合插入上傳功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)EditText圖文混合插入上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android操作系統(tǒng)的架構(gòu)設(shè)計(jì)分析

    Android操作系統(tǒng)的架構(gòu)設(shè)計(jì)分析

    這篇文章主要介紹了Android操作系統(tǒng)的架構(gòu)設(shè)計(jì)分析,Android系統(tǒng)架構(gòu)分為L(zhǎng)inux內(nèi)核驅(qū)動(dòng)、C/C ++框架、Java框架、Java應(yīng)用程序,本文分別講解了它的作用,需要的朋友可以參考下
    2015-06-06
  • android利用xml實(shí)現(xiàn)分割線

    android利用xml實(shí)現(xiàn)分割線

    這篇文章主要介紹了android利用xml實(shí)現(xiàn)分割線的方法,如何用xml產(chǎn)生一個(gè)分割線?感興趣的小伙伴們可以參考一下
    2015-12-12
  • android 觸屏的震動(dòng)響應(yīng)接口調(diào)用方法

    android 觸屏的震動(dòng)響應(yīng)接口調(diào)用方法

    android 相關(guān)開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)使用到觸屏的震動(dòng)響應(yīng)接口,為此本文列出以下方法,想要了解的朋友可以參考下
    2012-11-11
  • Android 下的 QuickJS Binding 庫(kù)特性使用詳解

    Android 下的 QuickJS Binding 庫(kù)特性使用詳解

    這篇文章主要介紹了Android 下的 QuickJS Binding 庫(kù)特性使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Android 通過(guò)API獲取數(shù)據(jù)庫(kù)中的圖片文件方式

    Android 通過(guò)API獲取數(shù)據(jù)庫(kù)中的圖片文件方式

    這篇文章主要介紹了Android 通過(guò)API獲取數(shù)據(jù)庫(kù)中的圖片文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • 詳解Android使用Socket對(duì)大文件進(jìn)行加密傳輸

    詳解Android使用Socket對(duì)大文件進(jìn)行加密傳輸

    這篇文章主要介紹了詳解Android使用Socket對(duì)大文件進(jìn)行加密傳輸,使用Socket進(jìn)行文件傳輸過(guò)程時(shí),需要先進(jìn)行加密,有興趣的可以了解一下。
    2017-01-01

最新評(píng)論