kotlin標(biāo)準(zhǔn)函數(shù)指的是Standard.kt文件中定義的函數(shù)。本文將根據(jù)函數(shù)功能的相似性一個一個記錄屏积。這些標(biāo)準(zhǔn)函數(shù)本質(zhì)上都是接收lambda參數(shù)的函數(shù),下文為了方便理解和使用却嗡,在描述上將使用更為通俗形象的說法闰渔。目前標(biāo)準(zhǔn)函數(shù)一共只有11個,如果同名重載的只算一個那就連10個也不到还绘。我們可將其大致分類為作用域函數(shù)(Scope Functions)痢毒、其他函數(shù)(除了作用域函數(shù)以外,其他函數(shù)沒有具體的歸類)蚕甥。
作用域函數(shù)(Scope Functions)
我們先看下官方對于作用域函數(shù)的介紹:
作用域函數(shù)一共有5個哪替,它們唯一的目的是在對象上下文環(huán)境中執(zhí)行代碼塊。當(dāng)你使用對象調(diào)用這些函數(shù)時菇怀,通過lambda表達(dá)式它們將給你提供一個臨時作用域凭舶。在這個范圍內(nèi)你可以不通過該對象的名字訪問該對象晌块。這種函數(shù)稱為作用域函數(shù)∷基本上匆背,這些函數(shù)的作用是相同的:在一個對象上執(zhí)行一段代碼。不同的是這個對象在塊中是如何變得可用的身冀,以及整個表達(dá)式的結(jié)果是什么钝尸。
我們先介紹這5個作用域函數(shù)(Scope Functions):let, run, with, apply, 和 also.
//這里的代碼是為了下文介紹標(biāo)準(zhǔn)函數(shù)使用到的“輔助”對象
val things = mutableListOf("pineapple", "apple", "pen")
class Student {
var name: String = ""
var age: Int = 0
}
var xiaoxin: Student? = null
let函數(shù)
描述:某對象“創(chuàng)建”一個擁有該對象引用的代碼區(qū)域。該引用在該區(qū)域的名字為“it”搂根,返回值為最后一行的返回值珍促,若最后一行無返回值則返回Unit(對應(yīng)java中的void)。
常見用處:主要配合"?."操作符來進(jìn)行輔助判空處理剩愧。
格式:
//由于全局變量可以在其他線程進(jìn)行操作猪叙,所以將下面的let語句換成if判斷語句仍然有空指針風(fēng)險
val letResult = xiaoxin?.let {
println(it.name)
println(it.age)
xiaoxin.name
}
also函數(shù)
**描述:also函數(shù)和let函數(shù)極其的相似。唯一的不同就是返回值不同仁卷,let是將lambda最后一行的返回值作為返回值穴翩,而also則是將被操作對象本身作為返回值。
格式:
//下文中的this只是為了表示其上下文為StringBuilder()對象锦积,可以省略
val letResult = xiaoxin?.also {
it.name = "xiao xin"
it.age = 18
}?.also {
println(it.name)
println(it.age)
}
run函數(shù)
**描述:run函數(shù)和let函數(shù)極其的相似芒帕。let是像將操作對象變成參數(shù)一樣的操作,而run函數(shù)則提供了被操作對象的上下文環(huán)境丰介,即通過“this”就可以調(diào)用被操作的對象(let函數(shù)中的it其實是lambda函數(shù)的參數(shù))副签。而返回值也和let一樣,返回最后一行基矮。
格式:
//下文中的this只是為了表示其上下文為StringBuilder()對象淆储,可以省略
val runResult = StringBuilder().run {
for (thing in things) {
this.append(thing).append("、")
}
this.toString()
}
run函數(shù)“重載”
**描述:除了上面描述的run函數(shù)外家浇,作用域函數(shù)中run還有一個“重載”的函數(shù)本砰,與前面的run函數(shù)不同,該“重載”函數(shù)并不是擴(kuò)展函數(shù)钢悲,且不提供任何對象的上下文環(huán)境点额。它的使用看起來就像僅僅開辟了一塊單獨的區(qū)域執(zhí)行某些語句。當(dāng)然它仍然是講最后一行的返回值作為該函數(shù)的返回值莺琳。
格式:
val run2Result = run {
val builder = StringBuilder()
for (thing in things) {
builder.append(thing).append("还棱、")
}
builder.toString()
}
apply函數(shù)
**描述:apply函數(shù)和run函數(shù)極其的相似。同樣的調(diào)用方式惭等,同樣提供上下文環(huán)境珍手,唯一不通的是apply的返回值不是最后一行,而是被操作對象本身。
格式:
//下文中的this只是為了表示其上下文為StringBuilder()對象琳要,可以省略
val applyResult = StringBuilder().apply {
for (thing in things) {
this.append(thing).append("寡具、")
}
}
with函數(shù)
描述:with和上面幾個函數(shù)有處明顯的不同,上面幾個函數(shù)都是擴(kuò)展函數(shù)(由于被擴(kuò)展的class為泛型形式表述稚补,所以所有的對象都可以調(diào)用上面那些函數(shù))童叠。而with則是以傳參的形式來操作對象(第一個參數(shù)為被操作對象,第二個為lambda函數(shù))课幕。同run厦坛、apply一樣創(chuàng)造了一個具有操作對象上下文的環(huán)境。同run乍惊、let一樣杜秸,最后一行為返回值。所以說with又和run極其相似污桦,對于操作對象的獲取一個是擴(kuò)展函數(shù)的形式,一個是傳參形式匙监。
格式:
val withResult = with(StringBuilder()) {
for (thing in things) {
this.append(thing).append("凡橱、")
}
this.toString()
}
上面幾個函數(shù)功能幾乎完全一樣,而且?guī)缀跛械氖褂们榫岸伎梢曰ハ嗵鎿Q亭姥,只有細(xì)微的使用方式不同稼钩,如何區(qū)分以及合理使用需要用戶通過大量的經(jīng)驗和習(xí)慣來實現(xiàn)。
下一遍文章將介紹kotlin標(biāo)準(zhǔn)函數(shù)中剩下的幾個函數(shù)(TODO达罗,takeIf坝撑,takeUnless,repeat)
地址:http://www.reibang.com/p/f9a7c2f1446b