91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sam函數怎么在Kotlin中使用

發布時間:2021-01-16 10:24:35 來源:億速云 閱讀:221 作者:Leah 欄目:移動開發

今天就跟大家聊聊有關sam函數怎么在Kotlin中使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

用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)

看完上述內容,你們對sam函數怎么在Kotlin中使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

信丰县| 清丰县| 甘肃省| 武冈市| 类乌齐县| 剑阁县| 南漳县| 安吉县| 天津市| 洱源县| 进贤县| 大名县| 宝鸡市| 新宾| 芦溪县| 雅江县| 洱源县| 阿拉善右旗| 咸宁市| 大足县| 南开区| 武功县| 克拉玛依市| 陈巴尔虎旗| 绥化市| 安泽县| 定南县| 五常市| 庆安县| 银川市| 澄迈县| 夏津县| 鄂尔多斯市| 大安市| 莫力| 永平县| 陈巴尔虎旗| 美姑县| 黑水县| 永年县| 江北区|