最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

用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 PicSelector圖片選擇器小功能

    Android PicSelector圖片選擇器小功能

    這篇文章主要為大家詳細介紹了Android PicSelector圖片選擇器小功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Android Studio 配置:自定義頭部代碼注釋及添加模版方式

    Android Studio 配置:自定義頭部代碼注釋及添加模版方式

    這篇文章主要介紹了Android Studio 配置:自定義頭部代碼注釋及添加模版方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • android實現(xiàn)滑動解鎖

    android實現(xiàn)滑動解鎖

    這篇文章主要為大家詳細介紹了android實現(xiàn)滑動解鎖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Android編程中EditText限制文字輸入的方法

    Android編程中EditText限制文字輸入的方法

    這篇文章主要介紹了Android編程中EditText限制文字輸入的方法,涉及Android針對EditText的監(jiān)聽技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Android中實現(xiàn)可滑動的Tab的3種方式

    Android中實現(xiàn)可滑動的Tab的3種方式

    這篇文章主要介紹了Android中實現(xiàn)可滑動的Tab的3種方式,需要的朋友可以參考下
    2014-02-02
  • Android實現(xiàn)帶圖標的列表對話框

    Android實現(xiàn)帶圖標的列表對話框

    這篇文章主要為大家詳細介紹了Android實現(xiàn)帶圖標的列表對話框,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android超詳細講解組件ScrollView的使用

    Android超詳細講解組件ScrollView的使用

    本節(jié)帶來的是Android基本UI控件中的第十個:ScrollView(滾動條),或者我們應(yīng)該叫他?豎直滾動條,對應(yīng)的另外一個水平方向上的滾動條:HorizontalScrollView,先讓我們來了解ScrollView
    2022-03-03
  • Android BSearchEdit 搜索結(jié)果選擇框的實例代碼

    Android BSearchEdit 搜索結(jié)果選擇框的實例代碼

    EditText搜索結(jié)果下拉框、自動or回調(diào)模式、可diy、使用超簡便。這篇文章主要介紹了Android BSearchEdit 搜索結(jié)果選擇框的實例代碼,需要的朋友可以參考下
    2019-10-10
  • Android如何獲取視頻首幀圖片

    Android如何獲取視頻首幀圖片

    這篇文章主要為大家詳細介紹了Android如何獲取視頻首幀圖片的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Android仿微信底部按鈕滑動變色

    Android仿微信底部按鈕滑動變色

    這篇文章主要介紹了Android仿微信底部按鈕滑動變色,使用Fragment為Tab頁的滑動操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評論

云浮市| 镇江市| 郧西县| 浦北县| 固镇县| 永靖县| 犍为县| 灵台县| 平邑县| 蓬溪县| 和龙市| 高密市| 镇康县| 许昌县| 资溪县| 资源县| 迁西县| 酒泉市| 腾冲县| 东安县| 莲花县| 宝应县| 许昌市| 高要市| 佛教| 延安市| 商城县| 怀仁县| 古蔺县| 克什克腾旗| 丽江市| 绥棱县| 韩城市| 喀喇| 齐齐哈尔市| 海原县| 景宁| 六盘水市| 博野县| 河津市| 巩义市|