上一篇:Kotlin一步一步學(xué)(一) -- 基礎(chǔ)快速入門(mén)
標(biāo)準(zhǔn)函數(shù)
Kotlin的標(biāo)準(zhǔn)函數(shù)指的是Standard.kt中定義的函數(shù)刽宪,任何Kotlin代碼都可以自由地調(diào)用所有的標(biāo)準(zhǔn)函數(shù)匾委。
這里我只介紹常用的4個(gè)標(biāo)準(zhǔn)函數(shù):let,with,run,apply函數(shù)。其他用到的時(shí)候請(qǐng)自行Google个束,不過(guò)其實(shí)也沒(méi)幾個(gè)了海诲。
let函數(shù)
在let函數(shù)塊內(nèi)通過(guò) it 指代調(diào)用的對(duì)象渣叛,返回值為函數(shù)塊的最后一行或指定return表達(dá)式哟玷。
一般寫(xiě)法
fun main() {
val text = "Kotlin 大法好"
println(text.length)
val result = "你說(shuō)的對(duì)蕊蝗!"
println(result)
}
let函數(shù)寫(xiě)法
fun main() {
val result = "Kotlin 大法好".let {
println(it.length) //it 代表的是字符串“Kotlin 大法好”
"你說(shuō)的對(duì)仅乓!" //最后一行,字符串“你說(shuō)的對(duì)匿又!”作為返回值返回了方灾。
}
println(result) //輸出結(jié)果是“你說(shuō)的對(duì)!”
}
經(jīng)常用let函數(shù)對(duì)一個(gè)可null的對(duì)象的一段代碼做統(tǒng)一判空處理。
with函數(shù)
with函數(shù)不是以擴(kuò)展函數(shù)的形式存在裕偿,它是將某對(duì)象作為函數(shù)的參數(shù)傳入洞慎。在函數(shù)塊內(nèi)通過(guò) this 指代該傳入的對(duì)象,返回值為函數(shù)塊的最后一行或指定return表達(dá)式嘿棘。
一般寫(xiě)法
fun main() {
var language = Language("Kotlin", 1)
println(language.name + language.rank)
var result = 100
println(result)
}
with寫(xiě)法
fun main() {
var result = with(Language("Kotlin", 1)) {
println(name + rank) //直接調(diào)用Language對(duì)象的屬性劲腿,不需要在屬性前帶對(duì)象名
100 //最后一行,100作為返回值返回了鸟妙。
}
println(result) //輸出結(jié)果是100
}
run函數(shù)
run函數(shù)的用法和使用場(chǎng)景跟with函數(shù)非常類(lèi)似焦人,只不過(guò)run函數(shù)不能直接調(diào)用,而是要調(diào)用某個(gè)對(duì)象的run函數(shù)才行重父。run函數(shù)只接受一個(gè)Lamnda參數(shù)花椭,并且會(huì)在Lambda表達(dá)式中提供調(diào)用對(duì)象的上下文,返回值為函數(shù)塊的最后一行或指定return表達(dá)式房午。
一般寫(xiě)法
fun main() {
var language = Language("Kotlin", 1)
println(language.name + language.rank)
var result = 100
println(result)
}
run寫(xiě)法
fun main() {
var result = Language("Kotlin", 1).run {
println(name + rank) //直接調(diào)用Language對(duì)象的屬性矿辽,不需要在屬性前帶對(duì)象名
100 //最后一行坯苹,100作為返回值返回了喊积。
}
println(result) //輸出結(jié)果是100
}
run函數(shù)是let,with兩個(gè)函數(shù)的結(jié)合體米母。它彌補(bǔ)了let函數(shù)在函數(shù)體內(nèi)必須用it參數(shù)替代對(duì)象撩穿,其可以像with函數(shù)一樣省略對(duì)象歧斟,直接調(diào)用對(duì)象的屬性和方法蚣抗;它也彌補(bǔ)了with函數(shù)傳入?yún)?shù)無(wú)法判空的問(wèn)題锉走。
apply函數(shù)
apply函數(shù)從結(jié)構(gòu)上跟run函數(shù)很像吩谦,不同的是它們的返回值不同扇售。run函數(shù)跟let前塔、with函數(shù)都是返回最后一行代碼的值;而apply函數(shù)返回的則是傳入對(duì)象的本身缘眶。
一般寫(xiě)法
fun main() {
var language = Language("Kotlin", 1)
println(language.name + language.rank)
var result = 100
println(result)
}
apply寫(xiě)法
fun main() {
var result = Language("Kotlin", 1).apply {
println(name + rank) //直接調(diào)用Language對(duì)象的屬性嘱根,不需要在屬性前帶對(duì)象名
100
}
println(result) //輸出結(jié)果是Language對(duì)象本身
}
apply一般用于對(duì)某一對(duì)象進(jìn)行初始化賦值,然后返回該對(duì)象巷懈。
總結(jié)
平時(shí)用的比較多的是run函數(shù)和apply函數(shù)该抒。當(dāng)需要對(duì)傳入對(duì)象進(jìn)行判空,并返回特定值時(shí)顶燕,采用run函數(shù)凑保。當(dāng)需要對(duì)傳入對(duì)象進(jìn)行判定和初始化參數(shù),并返回傳入的對(duì)象時(shí)涌攻,采用apply函數(shù)欧引。
靜態(tài)方法
靜態(tài)方法在某些編程語(yǔ)言里面又叫做類(lèi)方法,指的就是那種不需要?jiǎng)?chuàng)建實(shí)例就能調(diào)用的方法恳谎。一般不需要依賴(lài)其它類(lèi)或資源時(shí)芝此,就可以用靜態(tài)方法憋肖,這時(shí)就是一個(gè)面向過(guò)程的函數(shù)而已。
Java的寫(xiě)法
在Java中定義靜態(tài)方法非常簡(jiǎn)單婚苹,只需要在方法上聲明一個(gè)static關(guān)鍵字就可以了岸更,如下所示
public class Util {
public static void doSomething( ) {
System.out.println("do something");
}
}
Kotlin的寫(xiě)法
Kotlin中沒(méi)有直接定義靜態(tài)方法的關(guān)鍵字,需要使用伴生對(duì)象companion object來(lái)實(shí)現(xiàn)類(lèi)似的效果膊升,如下所示
class Util {
companion object {
fun doSomething ( ){
println ("do something")
}
}
}
不過(guò)doSomething( )方法實(shí)際并不是靜態(tài)方法怎炊,companion object這個(gè)關(guān)鍵字實(shí)際上會(huì)在Util類(lèi)的內(nèi)部創(chuàng)建一個(gè)伴生類(lèi),而doSomething( )方法就是定義在這個(gè)伴生類(lèi)里面的實(shí)例方法廓译。只是Kotlin會(huì)保證Util類(lèi)時(shí)鐘只會(huì)存在一個(gè)伴生類(lèi)對(duì)象评肆,因此調(diào)用Util.doSomething( )方法實(shí)際上市調(diào)用了Util類(lèi)中伴生對(duì)象的doSomething( )方法。
如果你確確實(shí)實(shí)需要定義真正的靜態(tài)方法非区,讓你在Java代碼中以靜態(tài)方法的形式去調(diào)用的話瓜挽,Kotlin仍然提供了兩種實(shí)現(xiàn)方式:注解和頂層方法。
在單例類(lèi)或companion object中的方法加上@JvmStatic注解征绸,那么Kotlin編譯器就會(huì)將這些方法編譯成真正的靜態(tài)方法秸抚,如下所示
class Util {
companion object {
@JvmStatic
fun doSomething ( ){
println ("do something")
}
}
}