Java lamda從java8版本開始流行,大大簡化了interface作爲參數傳遞的寫法,接觸到便深深愛上他了,這是前言!
Kotlin作爲語法糖版的Java,很大程度上簡化了java某些不必要的語法,從而使得很大程度上kotlin的開發速度會比java開發速度快。
Kotlin調用java的方法,如果需要傳interface作爲參數的話,一般kotlin會讓你使用kotlin轉換的lamda語法,比如Android給button添加點擊事件:
button.setOnClickListener{
}
不過kotlin自定義的interface卻無法使用lamda傳參!!emm…這就很尷尬
但是kotlin給出另一種大寶貝:
匿名函數
通過匿名函數,我們可以實現lamda,從而減少不必要的interface。
舉個例子:
你有一個一直讀取數據的線程A類,還有一個處理數據的線程B類,B類實例化了A類,這時B類需要獲取A類讀取的數據,但是A類是個異步讀取數據的類,這是你會先想到用interface來獲取數據,於是你這麼定義:
interface Ia{
fun readData(bytes:ByteArray)
}
class A(ia:Ia):Thread(){
override fun run(){
while(true){
val bytes=ByteArray(1024)
input.read(bytes)//某個讀取數據流的inputstream
ia.readData(bytes)
}
}
}
class B:Ia{
init{
A(object:Ia{
override fun readData(bytes:ByteArray){
//處理數據
}
})
}
}
這樣看上去還可以,有2個class跟1個接口,你覺得還不錯,但是跟java代碼量差不多。
接下來請看如果使用Lamda
class A(val readData:(bytes:ByteArray)->Unit):Thread(){
override fun run(){
while(true){
val bytes=ByteArray(1024)
input.read(bytes)//某個讀取數據流的inputstream
readData(bytes)
}
}
}
class B:Ia{
init{
A({
//處理數據
})
}
//上面是爲了給初學者看的,下面是給有基礎的童鞋看的
init{
A{
//處理數據
}
}
}
除了邏輯部分沒改變,interface接口已經被完成省略了。
解釋一下其他的:
val readData:(bytes:ByteArray)->Unit
Unit是返回類型,Unit就相當於void
就是不需要返回值,但是定義lamda必須要給,
所以無返回值也就是void,就直接寫Unit,
如果需要返回Int、String等等就改成對應的就行
好了,這就是lamda,lamda省略了一些臨時需要的interface接口,但是一些常用的接口,一個interface裏多個函數的還是規規矩矩的定義下一,畢竟這樣方便其他人理解!