Android面試題之Kotlin的apply、let、also、run函數(shù)

apply

apply函數(shù)可以看作是一個(gè)配置函數(shù),可以傳入一個(gè)接收者,然后調(diào)用一系列函數(shù)來(lái)配置以便使用,如果提供lambda給apply函數(shù)執(zhí)行,將返回配置好的接收者

apply能讓每個(gè)配置函數(shù)都作用于接收者

val file1 = File("C://Android").apply {
    setExecutable(false)
    setReadable(true)
    setWritable(true)
}

let

能使某個(gè)變量作用于其Lambda表達(dá)式里,讓it關(guān)鍵字能引用它。

fun main() {
    val result = listOf(3,2,1).first().let {
        it*it
    }
    println(result)
}

fun formatName(name:String?): String {
    return name?.let { "Whelcome, $it" } ?: "name?"
}

run

  • 和apply差不多,但返回的是lambda的執(zhí)行結(jié)果,而apply返回的是接收者
  • 可以執(zhí)行函數(shù)引用
  • 多個(gè)函數(shù)引用可以鏈?zhǔn)秸{(diào)用
fun main() {
    var file = File("D:test.txt")
    val result = file.run {
        readText().contains("hava")
    }
    println(result)
    //執(zhí)行函數(shù)引用
    "hhhhh"
        .run(::isLong)
        .run(::showTip)
        .run(::println)
}

fun isLong(name:String) = name.length >= 3

fun showTip(isLong:Boolean) :String {
    return if (isLong){
        "too long"
    }else{
        "OK"
    }
}

with

是run函數(shù)的變體,功能行為一樣,with的調(diào)用方式不同,with需要值參作為其第一個(gè)參數(shù)傳入

fun main() {
    val result = "hkjkj".run { length >=3 }
    println(result)
    val result1 = with("hkjkj"){
        length>=3
    }
    println(result1)
}

also

和let相似,需要把接收者值參傳給lambda,但also返回接收者對(duì)象。also尤其適合針對(duì)同一原始對(duì)象,可以基于原始接收者對(duì)象執(zhí)行額外的鏈?zhǔn)秸{(diào)用

fun main() {
    var fileContent:List<String>
    var reuslt = File("D://Android")
        .also { println(it.name) }
        .also { fileContent = it.readLines() }
    println(fileContent)
}

takeif

takeif函數(shù)需要判斷l(xiāng)ambda中提供的條件表達(dá)式的結(jié)果,如果是true,takeif函數(shù)返回接收者對(duì)象,如果是false,返回Null。

如果需要判斷某個(gè)條件是否滿足,再?zèng)Q定是否可以賦值變量或執(zhí)行某項(xiàng)任務(wù),takeif就非常有用

fun main() {
    val result = File("D://Android")
        .takeIf { it.exists() && it.canRead() }
        ?.readText()
    println(result)
}

takeUnless

與takeif的返回結(jié)果情況相反,返回為false才會(huì)返回

let、apply和run

函數(shù) 入?yún)?/th> 功能 返回值
let 當(dāng)前調(diào)用者,可以用it代替 可以對(duì)參數(shù)it進(jìn)行操作 返回lambda的結(jié)果
apply 無(wú) 調(diào)用當(dāng)前對(duì)象的一系列函數(shù) 返回接收者
run 無(wú) 調(diào)用接收者的一系列函數(shù),還可以執(zhí)行函數(shù)引用,也就是調(diào)用其他函數(shù) 返回lambda的結(jié)果

let會(huì)把接收者傳給lambda,而apply什么都不傳;匿名函數(shù)執(zhí)行完,apply會(huì)返回當(dāng)前的接收者,而let會(huì)返回lambda的最后一行

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

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

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