Kotlin 標準函數?with
、run
、apply
?的定義和使用
1.?with
?函數
定義:
with
?函數允許你在一個對象的上下文中執行一個 lambda 表達式,而不需要在 lambda 表達式中重復引用該對象。
@kotlin.internal.InlineOnly | |
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block() |
使用場景:
當你需要在多個地方引用同一個對象,并且不想每次都顯式地寫出這個對象名時,可以使用?with
?函數。
示例:
val stringBuilder = StringBuilder() | |
with(stringBuilder) { | |
append("Hello") | |
append(", ") | |
append("World!") | |
} | |
println(stringBuilder) // 輸出 "Hello, World!" |
2.?run
?函數
定義:
run
?是 Kotlin 中所有類的成員函數,用于在當前對象的上下文中執行一個 lambda 表達式,但不返回任何值(返回?Unit
)。
雖然這不是顯式定義的函數,但它是通過擴展函數為所有類隱式提供的。
使用場景:
當你需要在對象的上下文中執行一些操作,但不需要返回任何結果時,可以使用?run
。
示例(雖然不常見,因為可以直接在對象上調用方法):
val stringBuilder = StringBuilder() | |
stringBuilder.run { | |
append("Hello") | |
append(", ") | |
append("World!") | |
} | |
println(stringBuilder) // 輸出 "Hello, World!" |
3.?apply
?函數
定義:
apply
?是 Kotlin 的一個擴展函數,它執行給定的 lambda 表達式,并返回調用它的對象本身。
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this } |
使用場景:
當你需要在對象的上下文中執行一些操作,并希望返回該對象以便進行鏈式調用時,可以使用?apply
。
示例:
val stringBuilder = StringBuilder().apply { | |
append("Hello") | |
append(", ") | |
append("World!") | |
} | |
println(stringBuilder) // 輸出 "Hello, World!" |
區別
with
:接受一個對象和一個 lambda 表達式,在 lambda 表達式中可以直接調用該對象的方法,無需前綴。返回 lambda 表達式的返回值。run
:是類的成員函數,接受一個 lambda 表達式,在 lambda 表達式中可以直接調用該對象的方法。返回?Unit
。apply
:是擴展函數,接受一個 lambda 表達式,在 lambda 表達式中可以直接調用該對象的方法。返回調用它的對象本身。
定義靜態方法
在 Kotlin 中,沒有直接的“靜態方法”概念,但你可以通過以下幾種方式實現類似的功能:
- 頂層函數:在文件的頂層定義的函數可以在沒有類實例的情況下調用。
// MyUtils.kt | |
fun staticLikeFunction() { | |
// ... | |
} | |
// 在其他文件中 | |
MyUtilsKt.staticLikeFunction() // 注意:Kotlin 會為頂層函數生成一個包含文件名的類(除非你用 @file:JvmName 指定一個名稱) |
- 對象表達式或對象聲明:你可以創建一個單例對象,并在其中定義函數。
object MyUtils { | |
@JvmStatic // 如果你希望這個函數在 Java 中看起來像靜態的 | |
fun staticLikeFunction() { | |
// ... | |
} | |
} | |
// 調用 | |
MyUtils.staticLikeFunction() |