Kotlin中的let、with、also、run、apply

前言

Kotlin是一種在Java虛擬機上運行的靜態(tài)類型編程語言,被稱之為Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成為Android官方開發(fā)語言

作用域函數(shù)使我們很頻繁使用的函數(shù),它的作用是形成一個特定對象的作用域,可以簡化我們的代碼邏輯,提高開發(fā)效率

let

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

頂層函數(shù),返回值為lambda表達式的執(zhí)行結(jié)果
常用方式: 非空對象執(zhí)行代碼塊,使用it引用對象

context?.let {
    //當context不為null是執(zhí)行此代碼塊
    addView(TextView(it))
    addView(ImageView(it))
}

with

@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

頂層函數(shù),返回值為lambda表達式的執(zhí)行結(jié)果
常用方式,用于 一組對象的連續(xù)調(diào)用,使用this引用對象

service.setModel("None")
service.setLogLevel(LogLevel.E)
service.init(ID)
//使用with
with(service){
    setModel("None")
    service.setLogLevel(LogLevel.E)
    service.init(ID)
}

also

public inline fun <T> T.also(block: (T) -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block(this)
    return this
}

頂層函數(shù),返回值為當前調(diào)用對象
常用方式,用于對象的 附加操作,使用it引用對象

fun getResposne(){
    ...
    return response.also{
        Log.e("mike","--$it--")
    }
}

apply

public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

頂層函數(shù),返回值為當前調(diào)用對象
常用方式,用于對象的 配置,使用this引用對象

fun getResposne(){
    ...
    return response.apply{
        code = 200
        value = "Success!"
    }
}

總結(jié)

let作用域內(nèi)操作對象為it,返回lambda表達式的執(zhí)行結(jié)果,主要用于對象判空的場景
with作用域內(nèi)操作對象為this,返回lambda表達式的執(zhí)行結(jié)果,主要用于一組連續(xù)對象調(diào)用的場景
also作用域內(nèi)操作對象為it,返回當前對象,主要用于執(zhí)行附加操作的場景
apply作用域內(nèi)操作對象為this,返回當前對象,主要用于對象的配置場景

注意事項

val status = 1
if (status == 1) {
    Log.e("mike", "--one--")
} else if (status == 2) {
    Log.e("mike", "--two--")
} else {
    Log.e("mike", "--else--")
}
//結(jié)果打印 one
if (status == 1) {
    "one"
} else if (status == 2) {
    "two"
} else {
    "else"
}.let {
    Log.e("mike", "--$it--")
}
//結(jié)果沒有日志輸出

歡迎關(guān)注Mike的簡書

Android知識整理

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

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

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