Kotlin標(biāo)準(zhǔn)函數(shù):takeIf、takeUnless(譯文)

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()) }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容