介紹
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類型為T,y類型為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()
}
}