国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Kotlin 之 let、with、run、apply、also 函數(shù)的使用

這篇具有很好參考價(jià)值的文章主要介紹了Kotlin 之 let、with、run、apply、also 函數(shù)的使用。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、內(nèi)聯(lián)拓展函數(shù) let

let 擴(kuò)展函數(shù)的實(shí)際上是一個(gè)作用域函數(shù),當(dāng)你需要去定義一個(gè)變量在一個(gè)特定的作用域范圍內(nèi),let函數(shù)的是一個(gè)不錯(cuò)的選擇;let函數(shù)另一個(gè)作用就是可以避免寫一些判斷null的操作。

1.1 let 函數(shù)的使用的一般結(jié)構(gòu)

object.let {
    it.todo() //在函數(shù)體內(nèi)使用it替代object對象去訪問其公有的屬性和方法
    ...
}

//另一種用途 判斷object為null的操作
object?.let { //表示object不為null的條件下,才會(huì)去執(zhí)行l(wèi)et函數(shù)體
    it.todo()
}

1.2 let函數(shù)底層的inline擴(kuò)展函數(shù)+lambda結(jié)構(gòu)

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

意思就是 T 類型的對象調(diào)用 let 方法,實(shí)際調(diào)用的是傳入 let 方法的 lambda 表達(dá)式的 block 塊,最終返回 lambda 表達(dá)式的返回值。

lambda 表達(dá)式內(nèi)部通過 it 指代該對象。

1.3 let 函數(shù)常見的適用的場景

  • 場景一: 最常用的場景就是使用let函數(shù)處理需要針對一個(gè)可null的對象統(tǒng)一做判空處理。

  • 場景二: 然后就是需要去明確一個(gè)變量所處特定的作用域范圍內(nèi)可以使用

obj?.funA()
obj?.funB()
obj?.funC()

obj?.let {
    it.funA()
    it.funB()
    it.funC()
}

二、內(nèi)聯(lián)函數(shù) with

2.1 with 函數(shù)使用的一般結(jié)構(gòu)

with(object) {
    //todo
}

2.2 with 函數(shù)底層的inline擴(kuò)展函數(shù)+lambda 結(jié)構(gòu)

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

注意,這個(gè) with 函數(shù)不是拓展函數(shù),它接收兩個(gè)參數(shù),第一個(gè)參數(shù)是要是用的對象,第二個(gè)參數(shù)是一個(gè) lambda 表達(dá)式,該方法實(shí)際調(diào)用的是第一個(gè)參數(shù)對象,進(jìn)行 block 塊的調(diào)用,

最終返回 lambda 表達(dá)式的返回值。

lambda 表達(dá)式內(nèi)部通過 this 指代該對象。

2.3 with 函數(shù)的適用的場景

適用于調(diào)用同一個(gè)類的多個(gè)方法時(shí),可以省去類名重復(fù),直接調(diào)用類的方法即可,經(jīng)常用于Android中RecyclerView中onBinderViewHolder中,數(shù)據(jù)model的屬性映射到UI上。

obj.funA()
obj.funB()
obj.funC()

with(obj) {
    this.funA()
    funB() // this 可省略
    funC)
}

三、 內(nèi)聯(lián)拓展函數(shù) run

3.1 run 函數(shù)使用的一般結(jié)構(gòu)

object.run {
    // todo
}

3.2 run 函數(shù)的inline+lambda 結(jié)構(gòu)

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

run 函數(shù)實(shí)際上可以說是let和with兩個(gè)函數(shù)的結(jié)合體,run函數(shù)只接收一個(gè)lambda函數(shù)為參數(shù),以閉包形式返回,即返回 lambda 表達(dá)式的返回值。

3.3 run 函數(shù)的適用場景

obj?.funA()
obj?.funB()
obj?.funC()

obj?.run {
    this.funA()
    funB() // this 可省略
    funC)
}

四、內(nèi)聯(lián)拓展函數(shù) apply

4.1 apply 函數(shù)使用的一般結(jié)構(gòu)

object.apply {
    // todo
}

4.2 apply 函數(shù)的inline+lambda結(jié)構(gòu)

@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    returnthis
}

從結(jié)構(gòu)上來看apply函數(shù)和run函數(shù)很像,唯一不同點(diǎn)就是它們各自返回的值不一樣,run函數(shù)是以閉包形式返回最后一行代碼的值,而apply函數(shù)的返回的是傳入對象的本身。

五、內(nèi)聯(lián)擴(kuò)展函數(shù) also

5.1 also 函數(shù)使用的一般結(jié)構(gòu)

object.also {
    // todo
}

5.2 also 函數(shù)的inline+lambda結(jié)構(gòu)

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

also函數(shù)的結(jié)構(gòu)實(shí)際上和let很像唯一的區(qū)別就是返回值的不一樣,let是以閉包的形式返回,返回函數(shù)體內(nèi)最后一行的值,如果最后一行為空就返回一個(gè)Unit類型的默認(rèn)值。而also函數(shù)返回的則是傳入對象的本身。

六、比較總結(jié)

函數(shù)名

定義inline的結(jié)構(gòu)

函數(shù)體內(nèi)使用的對象

返回值

是否是擴(kuò)展函數(shù)

let

fun T.let(block: (T) -> R): R = block(this)

it指代當(dāng)前對象

閉包形式返回

with

fun with(receiver: T, block: T.() -> R): R = receiver.block()

this指代當(dāng)前對象或者省略

閉包形式返回

run

fun T.run(block: T.() -> R): R = block()

this指代當(dāng)前對象或者省略

閉包形式返回

apply

fun T.apply(block: T.() -> Unit): T

this指代當(dāng)前對象或者省略

返回this

also

fun T.also(block: (T) -> Unit): T

it指代當(dāng)前對象

返回this

七、實(shí)用例子————Kotlin 實(shí)現(xiàn)單例模式

Kotlin 實(shí)現(xiàn)單例模式相對 java 來說很簡單。比如通過 object, by lazy 操作,相信大家都會(huì)。但有時(shí)候,我們想要在單例初始化的時(shí)候順便做一下其它初始化,極有可能會(huì)還需要傳入?yún)?shù)。

使用 java 時(shí),我最喜歡的實(shí)現(xiàn)單例模式是靜態(tài)內(nèi)部類的方式,但在 Android 中經(jīng)常在初始化的時(shí)候需要傳入 context ,然后選擇了雙重檢查鎖方式。

先看 java 代碼:

public class Singleton {
    private Singleton() {
    }

    /**
     * volatile is since JDK5
     */
    private static volatile Singleton sSingleton;

    public static Singleton getInstance() {
        if (sSingleton == null) {
            synchronized (Singleton.class) {
                // 未初始化,則初始instance變量
                if (sSingleton == null) {
                    sSingleton = new Singleton();
                }
            }
        }
        return sSingleton;
    }
}

再看看我們用 kotlin 實(shí)現(xiàn)

class Singleton private constructor(){
    companion object {
        @Volatile
        private var instance: Singleton? = null

        fun getInstance(context: Context): Singleton {
            return instance?: synchronized(this) {
                instance?:Singleton().also {
                    instance = it
                }
            }
        }
    }
}

如果要做初始化操作,我們完全可以在 also 函數(shù)里面去處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-792869.html

到了這里,關(guān)于Kotlin 之 let、with、run、apply、also 函數(shù)的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • kotlin標(biāo)準(zhǔn)函數(shù)also

    在 Kotlin 中,also 是一個(gè)標(biāo)準(zhǔn)庫函數(shù),其作用是將一個(gè)對象作為參數(shù)傳遞給 Lambda 表達(dá)式,并返回該對象本身 。語法如下: 使用 also 可以使代碼更加簡潔,常用于一系列需要對同一個(gè)對象進(jìn)行多次操作的場景。例如: 上述代碼首先輸出字符串的長度,然后將其賦值給 length 變

    2024年02月06日
    瀏覽(28)
  • 【Kotlin】DSL 領(lǐng)域特定語言 ( apply 標(biāo)準(zhǔn)庫函數(shù)分析 | 普通匿名函數(shù) | 擴(kuò)展匿名函數(shù) | 泛型擴(kuò)展匿名函數(shù) )

    【Kotlin】DSL 領(lǐng)域特定語言 ( apply 標(biāo)準(zhǔn)庫函數(shù)分析 | 普通匿名函數(shù) | 擴(kuò)展匿名函數(shù) | 泛型擴(kuò)展匿名函數(shù) )

    本章總結(jié) : 讀懂 apply 標(biāo)準(zhǔn)庫函數(shù) 核心是其 block: T.() - Unit 參數(shù) , 這是 泛型擴(kuò)展匿名函數(shù) ; 泛型擴(kuò)展匿名函數(shù) T.() - Unit 演變路徑 : 普通匿名函數(shù) : () - Unit , 這個(gè)函數(shù) 參數(shù) 和 返回值 都為空 ; 擴(kuò)展匿名函數(shù) : String.() - Unit , 這個(gè)函數(shù) 是 為 具體的 String 類型定義的擴(kuò)展函數(shù) ; 泛型

    2023年04月09日
    瀏覽(23)
  • 【第三階段】kotlin中使用帶let的安全調(diào)用

    【第三階段】kotlin中使用帶let的安全調(diào)用

    let常常和?.配合使用,如果前面的對象為null,let不執(zhí)行,能夠執(zhí)行到let里面 對象一定不為null 1.不為null 執(zhí)行結(jié)果 2.為“ ” 執(zhí)行結(jié)果 3.為null 執(zhí)行結(jié)果

    2024年02月12日
    瀏覽(20)
  • 【錯(cuò)誤記錄】Android Studio 中 Kotlin 版本報(bào)錯(cuò) ( Module was compiled with an incompatible version of Kotlin. T )

    【錯(cuò)誤記錄】Android Studio 中 Kotlin 版本報(bào)錯(cuò) ( Module was compiled with an incompatible version of Kotlin. T )

    在 Android Studio 中 , 編譯應(yīng)用 , 報(bào)如下錯(cuò)誤 : 這個(gè)報(bào)錯(cuò)問題 , 出現(xiàn)了十幾次 ; 詳細(xì)報(bào)錯(cuò)信息如下 : 下面的報(bào)錯(cuò)信息 , 僅做參考 , 就不要點(diǎn)開了 ; 核心報(bào)錯(cuò)信息如下 : Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.1.13. 大概含義就

    2024年02月05日
    瀏覽(38)
  • Kotlin判斷null比較let布爾值Boolean

    data.count != null data.count!! true false false kotlin,null let expression_zhangphil的博客-CSDN博客 當(dāng)a不為null時(shí),執(zhí)行大括號里的語句(it肯定不為null)如果a == null ,則為 null。= null,則a.b()如果 a 不是 b,則為 null。當(dāng)a==null時(shí),執(zhí)行b。當(dāng)a不為null時(shí),執(zhí)行大括號里的語句(it肯定不為null)如果a

    2024年02月10日
    瀏覽(30)
  • Android kotlin高階函數(shù)與Java lambda表達(dá)式介紹與實(shí)戰(zhàn)

    ????????目前在Java JDK版本的不斷升高,新的表達(dá)式已開始出現(xiàn),但是在Android混淆開發(fā)中,kotlin的語言與Java的語言是緊密貼合的。所以Java lambda表達(dá)式在kotlin中以新的身份出現(xiàn):高階函數(shù)與lambda表達(dá)式特別類似。接下來我講會(huì)先講Java的lambda,再介紹kotlin的高階函數(shù)。 2.1

    2024年02月15日
    瀏覽(94)
  • 【錯(cuò)誤記錄】Android Studio 編譯報(bào)錯(cuò) ( Module was compiled with an incompatible version of Kotlin. The binary )

    【錯(cuò)誤記錄】Android Studio 編譯報(bào)錯(cuò) ( Module was compiled with an incompatible version of Kotlin. The binary )

    Android Studio 工程在編譯時(shí) , 報(bào)如下錯(cuò)誤 : 直接把報(bào)錯(cuò)信息翻譯一下 : 報(bào)錯(cuò)的模塊是 e: C:/Users/octop/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.7.10/bac80c520d0a9e3f3673bc2658c6ed02ef45a76a/kotlin-stdlib-common-1.7.10.jar!/META-INF/kotlin-stdlib-common.kotlin_module 模塊 , 就是 kotlin-stdlib-c

    2024年01月20日
    瀏覽(21)
  • Android使用Gradle kotlin dsl 優(yōu)雅配置構(gòu)建項(xiàng)目

    Android使用Gradle kotlin dsl 優(yōu)雅配置構(gòu)建項(xiàng)目

    Gradle的出現(xiàn)可以說是為Android的項(xiàng)目構(gòu)建插上了翅膀,讓Android的apk打包構(gòu)建更簡單高效。開發(fā)者可以自己去定義打包的過程,比如在打包的過程中進(jìn)行字節(jié)碼插樁,多渠道打包,在老版本的Android中還可以依賴Gradle實(shí)現(xiàn)APP的插件化開發(fā)。但是Gradle是使用Groovy語言開發(fā)的,雖然說

    2024年02月13日
    瀏覽(19)
  • Android kotlin實(shí)戰(zhàn)之協(xié)程suspend詳解與使用

    Android kotlin實(shí)戰(zhàn)之協(xié)程suspend詳解與使用

    ????????Kotlin 是一門僅在標(biāo)準(zhǔn)庫中提供最基本底層 API 以便各種其他庫能夠利用協(xié)程的語言。與許多其他具有類似功能的語言不同, async ?與? await ?在 Kotlin 中并不是,甚至都不是標(biāo)準(zhǔn)庫的一部分。此外,Kotlin 的? 掛起函數(shù) ?概念為異步操作提供了比 future 與 pro

    2024年02月03日
    瀏覽(23)
  • Android kotlin序列化之@Parcelize詳解與使用

    Android kotlin序列化之@Parcelize詳解與使用

    ????????在Android開發(fā)過程中,序列化使用概率一直很高。在頁面之間傳遞的對象,需要要使用序列化,常見的序列化:Parcelable、Serialization。 ????????由于Parcelable在傳遞壓縮比高,效率高,一直被Google官方推薦。在Java語言中,Parcelable可以通過IDE自動(dòng)生成,但是在kot

    2024年02月08日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包