Kotlin---代碼塊與Lambda

介紹

Kotlin在原本的語法糖(Syntactic sugar)中加入了很多有意思的語法,讓編程看起來更加順暢,更加簡潔,方便閱讀。

Lambda

通常一個簡單函數(shù),可以使用Lambda來定義函數(shù):

  • var addValue:定義變量
  • (Int,Int) ->Int:定義變量的類型,接收兩個Int,返回Int
  • {x,y->x+y}:定義變量的值
fun test() {
      var addValue: (Int, Int) -> Int = { x, y -> x + y }
      var result = addValue(10, 20)
}

函數(shù)與代碼塊

在函數(shù)定義中,也可以使用代碼塊以及Lambda來定義,讓函數(shù)定義與使用更加賞心悅目。

下面的代碼在test函數(shù)中定義了兩個Int的參數(shù),以及一個名為block的代碼塊參數(shù)。而這個block則不傳遞任何參數(shù),并且會返回String類型的結(jié)果。

class GardenPlant {

    fun main() {
        test(n = 10, m = 1) {
            "Hello World"
        }
    }

    fun test(m: Int, n: Int, block: () -> String) {
        println(block())
        print("m:$m....n:$n")
    }
}

而有意思的是,當(dāng)函數(shù)的參數(shù)最后是一個代碼塊的時候,Kotlin允許使用Lambda來代替參數(shù),也就不需要寫在參數(shù)列表中了。

函數(shù)與多參數(shù)代碼塊

在函數(shù)的參數(shù)中,也可以使用<T>來標(biāo)識泛型。在編譯器處理的過程中,會將泛型擦除,編譯的時候,會是具體的類型。
例如,在編譯的時候,下述test的代碼塊中,x``就已經(jīng)標(biāo)識為了String```類型。

而在block:(T,int) ->R這一句話中,代表了代碼塊中可以接受兩個參數(shù),并且返回R類型的結(jié)果。
在使用test函數(shù)的地方,可以看到這個Lambda語句中x,y->代表了接收的兩個參數(shù),x類型為Ty類型為Int類型。

class GardenPlant {

    fun main() {
        test("Test") { x, y ->
            if (x == "Test") {
                y
            } else {
                0
            }
        }
    }

    fun <T, R> test(value: T, block: (T, Int) -> R): GardenPlant {
        val result = block(value, 20)
        println(result)
        return this
    }
}

函數(shù)與擴展函數(shù)的使用

對于擴展函數(shù)的使用,Kotlin也支持泛型,并且可以支持兩種擴展函數(shù)如下:

test函數(shù)中,使用T.test來定義泛型的擴展函數(shù),并且block:(T)->R定義了接收參數(shù)T的代碼塊,并且返回R對象,在test的代碼塊中,可以自己定義參數(shù)或者使用it來接收參數(shù)。

test2函數(shù)中,使用block:T.()->R來定義T的擴展函數(shù),并且返回R,而在test2的代碼塊中可以使用this來引用對象。

class GardenPlant {
    lateinit var plantName: String

    fun main() {
        val plant = GardenPlant()
        plant.test(plant) { p ->
            p.plantName
        }
    }

    fun <T, R> T.test(value: GardenPlant, block: (T) -> R): R {
        return block(this)
    }

    fun <T, R> T.test2(value: GardenPlant, block: T.() -> R): R {
        return block()
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容