Kotlin作用域函數(shù)(Scope Functions)
在 Kotlin 中撞羽,let、run衫冻、also诀紊、apply 和 with 是標(biāo)準(zhǔn)庫(kù)中提供的幾個(gè)非常有用的作用域函數(shù)(Scope Functions)。它們的主要作用是在對(duì)象的上下文中執(zhí)行代碼塊隅俘,并且每個(gè)函數(shù)在返回值和使用方式上有所不同邻奠。
1. let
作用:在非空對(duì)象上執(zhí)行代碼塊,并將對(duì)象作為參數(shù)傳遞到代碼塊中为居。
返回值:代碼塊的返回值碌宴。
-
典型使用場(chǎng)景:對(duì)非空對(duì)象進(jìn)行操作,或者鏈?zhǔn)秸{(diào)用時(shí)避免空指針蒙畴。
val result = obj?.let { // 在非空對(duì)象上執(zhí)行操作 it.doSomething() it.name // 返回最后一個(gè)表達(dá)式的結(jié)果 }
2. run
作用:在對(duì)象上執(zhí)行代碼塊贰镣,可以直接訪問(wèn)對(duì)象的屬性和方法。
返回值:代碼塊的返回值。
典型使用場(chǎng)景:需要在對(duì)象上下文中執(zhí)行一些操作并返回結(jié)果八孝。
val result = obj.run {
// 直接訪問(wèn)對(duì)象的屬性和方法
doSomething()
name // 返回最后一個(gè)表達(dá)式的結(jié)果
}
3. also
作用:在對(duì)象上執(zhí)行代碼塊董朝,并將對(duì)象作為參數(shù)傳遞到代碼塊中。
返回值:對(duì)象本身干跛。
典型使用場(chǎng)景:需要在操作對(duì)象的同時(shí)返回對(duì)象本身(例如鏈?zhǔn)秸{(diào)用)。
val result = obj.also {
// 對(duì)對(duì)象執(zhí)行一些操作
it.doSomething()
} // 返回 obj 本身
4. apply
作用:在對(duì)象上執(zhí)行代碼塊祟绊,可以直接訪問(wèn)對(duì)象的屬性和方法楼入。
返回值:對(duì)象本身。
典型使用場(chǎng)景:初始化對(duì)象或配置對(duì)象的屬性牧抽。
val result = obj.apply {
// 直接訪問(wèn)對(duì)象的屬性和方法
name = "Kotlin"
age = 10
} // 返回 obj 本身
5. with
作用:在對(duì)象上執(zhí)行代碼塊嘉熊,可以直接訪問(wèn)對(duì)象的屬性和方法。
返回值:代碼塊的返回值扬舒。
典型使用場(chǎng)景:對(duì)一個(gè)對(duì)象執(zhí)行多個(gè)操作阐肤,而不需要鏈?zhǔn)秸{(diào)用。
val result = with(obj) {
// 直接訪問(wèn)對(duì)象的屬性和方法
doSomething()
name // 返回最后一個(gè)表達(dá)式的結(jié)果
}
對(duì)比表格
函數(shù) | 上下文對(duì)象 (this/it) | 上下文對(duì)象 (this/it) | 上下文對(duì)象 (this/it) |
---|---|---|---|
let | it | 代碼塊返回值 | 非空對(duì)象操作讲坎、鏈?zhǔn)秸{(diào)用 |
run | this | 代碼塊返回值 | 對(duì)象上下文操作并返回結(jié)果 |
also | it | 對(duì)象本身 | 操作對(duì)象并返回對(duì)象本身 |
apply | this | 對(duì)象本身 | 初始化或配置對(duì)象 |
with | this | 代碼塊返回值 | 對(duì)一個(gè)對(duì)象執(zhí)行多個(gè)操作 |
6. takeIf 和 takeUnless
takeIf:如果條件為 true孕惜,則返回對(duì)象本身,否則返回 null晨炕。
takeUnless:如果條件為 false衫画,則返回對(duì)象本身,否則返回 null瓮栗。
val result = obj.takeIf { it.isValid() } // 如果 isValid() 為 true削罩,返回 obj,否則返回 null
val result2 = obj.takeUnless { it.isInvalid() } // 如果 isInvalid() 為 false费奸,返回 obj弥激,否則返回 null
7. repeat
作用:重復(fù)執(zhí)行某個(gè)操作指定的次數(shù)。
典型使用場(chǎng)景:需要重復(fù)執(zhí)行某些操作愿阐。
repeat(5) {
println("Hello, Kotlin!")
}
8. use
作用:用于自動(dòng)關(guān)閉資源(實(shí)現(xiàn)了 Closeable 接口的對(duì)象)微服。
典型使用場(chǎng)景:處理文件、網(wǎng)絡(luò)連接等需要關(guān)閉的資源换况。
File("example.txt").bufferedReader().use { reader ->
println(reader.readText())
} // 自動(dòng)關(guān)閉 reader
總結(jié)
let:適合非空對(duì)象操作职辨,返回代碼塊結(jié)果。
run:適合對(duì)象上下文操作戈二,返回代碼塊結(jié)果舒裤。
also:適合操作對(duì)象并返回對(duì)象本身。
apply:適合初始化或配置對(duì)象觉吭,返回對(duì)象本身腾供。
with:適合對(duì)一個(gè)對(duì)象執(zhí)行多個(gè)操作,返回代碼塊結(jié)果。