Lambda表達(dá)式是一種很簡(jiǎn)單的方法学赛,去定義一個(gè)匿名函數(shù)。Lambda是非常有用
的吞杭,因?yàn)樗鼈儽苊馕覀內(nèi)懸恍┌四承┖瘮?shù)的抽象類或者接口罢屈,然后在類中去
實(shí)現(xiàn)它們。在Kotlin篇亭,我們把一個(gè)函數(shù)作為另一個(gè)函數(shù)的參數(shù)缠捌。(說(shuō)了這么多就是想裝逼) 直奔主題, 拿 onclick 練練手译蒂,先做個(gè)對(duì)比:
java :
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toast("java")
}
}
kotlin:
button.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
toast("kotlin")
}
})
Lambdas:
button.setOnClickListener{
toast("Lambdas")
}
簡(jiǎn)潔曼月,這是我想了解Lambdas的主要原因,下面具體介紹一下:
一個(gè)lambda表達(dá)式通過(guò)參數(shù)的形式被定義在箭頭的左邊(被圓括號(hào)包圍)哑芹,然后在箭頭的右邊返回結(jié)果值。在這個(gè)例子中捕透,我們接收一個(gè)View聪姿,然后返回一個(gè)Unit
fun setOnClickListener(listener : (View)-> Unit)
(Unit 表示沒有東西,也可以寫要執(zhí)行的邏輯,比如上面的toast())乙嘀。所以根據(jù)這種思想末购,我們可以把代碼簡(jiǎn)化成這樣(當(dāng)我們定義了一個(gè)方法,我們必須使用大括號(hào)包圍):
// 在箭頭的左邊指定參數(shù)虎谢,在箭頭的右邊返回函數(shù)執(zhí)行的結(jié)果
button.setOnClickListener({listener -> Unit})
如果左邊的參數(shù)沒有使用到盟榴,我們甚至可以省略左邊的參數(shù):
// 省略左邊的函數(shù) 為了便于觀看,寫入一個(gè)吐司
button.setOnClickListener({ toast("Lambdas") })
如果這個(gè)函數(shù)的最后一個(gè)參數(shù)是一個(gè)函數(shù)婴噩,可以把這個(gè)函數(shù)移動(dòng)到圓括號(hào)外面:
// 移動(dòng)函數(shù)(即大括號(hào)中的東西)
button.setOnClickListener(){ toast("Lambdas") }
并且擎场,最后羽德,如果這個(gè)函數(shù)只有一個(gè)參數(shù),我們可以省略這個(gè)圓括號(hào):
// 省略圓括號(hào)
button.setOnClickListener{ toast("Lambdas") }
定義一個(gè)多個(gè)參數(shù)的方法:
fun setLambdas(p0 : Int, view : (View)->Unit){}
// 正常調(diào)用(最后一個(gè)參數(shù)是函數(shù)迅办,所以可以將大括號(hào)挪出圓括號(hào)外面)
setLambdas(0){view -> Unit}
// 調(diào)用時(shí),最后一個(gè)參數(shù)View 沒有使用
setLambdas(0){}