Kotlin 用好Lamda,減少不必要的Interface

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裏多個函數的還是規規矩矩的定義下一,畢竟這樣方便其他人理解!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章