takeIf、takeUnless都是Kotlin的擴(kuò)展功能。先簡單了解Kotlin中的擴(kuò)展功能和Lambda函數(shù)。
翻譯原文:difference between kotlin also, apply, let, use, takeIf and takeUnless in Kotlin
看完此篇更易理解:Kotlin標(biāo)準(zhǔn)函數(shù):let、with、run、apply和also
擴(kuò)展功能:
通過使用擴(kuò)展函數(shù),可以在不繼承類的情況下為類創(chuàng)建函數(shù)。
示例:
//要查找String中是否只有數(shù)字,可以創(chuàng)建如下所示的方法而無需繼承String類
fun String.isNumber(): Boolean = this.matches("[0-9]+".toRegex())
//可以這樣使用上面的擴(kuò)展功能
val phoneNumber = "138888888888"
println(phoneNumber.isNumber) //打印 true
Lambda函數(shù)
Lambda函數(shù)就像Java中的Interface一樣.但是在Kotlin中,可以將Lambda函數(shù)作為參數(shù)傳遞給函數(shù)。
示例:
//block是Lambda函數(shù),它作為參數(shù)傳遞
fun String.isNumber(block: () -> Unit): Boolean {
return if (this.matches("[0-9]+".toRegex())) {
block()
true
} else false
}
//可以這樣使用
val phoneNumber = "138888888888"
println(phoneNumber.isNumber {
println("Block executed")
})
//打?。?Block executed
true
let函數(shù)
源碼:
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
使用了T和R兩種類型
T.let
T可以是任何類似于String類的對(duì)象,因此可以對(duì)任何對(duì)象調(diào)用此函數(shù)
block: (T) -> R
在let的參數(shù)中,可以看到上面的Lambda函數(shù)。同樣,調(diào)用對(duì)象作為函數(shù)的參數(shù)傳遞。因此,可以在函數(shù)內(nèi)部使用調(diào)用類對(duì)象。然后返回R(另一個(gè)對(duì)象)。
示例:
val phoneNumber = "138888888888"
//String調(diào)用對(duì)象作為Lambda函數(shù)的參數(shù),返回Pair類型
val numberAndCount: Pair<Int, Int> = phoneNumber.let { it.toInt() to it.count() }
also函數(shù)
源碼:
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
將調(diào)用類作為Lambda函數(shù)的參數(shù),但不返回任何值
示例:
val phoneNumber = "138888888888"
phoneNumber.also { number ->
println(number.contains("8"))
println(number.length)
}
apply函數(shù)
源碼:
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
與also函數(shù)類似,但作為函數(shù)傳遞的調(diào)用對(duì)象相同,因此可以不用調(diào)用T參數(shù)直接使用T的方法和屬性(在Lambda函數(shù)內(nèi)部直接調(diào)用String類的屬性方法)。
示例:
val phoneNumber = "138888888888"
phoneNumber.apply {
println(contains("8"))
println(length)
}
takeIf函數(shù)
源碼:
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
predicate 函數(shù)將 T 對(duì)象作為參數(shù);根據(jù) predicate 的結(jié)果最終返回 this 或 null。
示例:
val phoneNumber = "138888888888"
//number只有當(dāng)phoneNumber與正則表達(dá)式匹配時(shí)才等于字符串phoneNumber。 否則number將為null
val number = phoneNumber.takeIf { it.matches("[0-9]+".toRegex()) }
takeUnless函數(shù)
源碼:
public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null
示例:
val phoneNumber = "138888888888"
//與takeIf相反,number僅在與regex不匹配時(shí)才等于字符串phoneNumber.否則它將為null
val number = phoneNumber.takeUnless { it.matches("[0-9]+".toRegex()) }