最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kotlin標(biāo)準(zhǔn)庫函數(shù)使用分析及介紹

 更新時間:2022年09月06日 10:29:33   作者:niuyongzhi  
Kotlin提供了一個系統(tǒng)庫,是Java庫的增強(qiáng)。其中有很多函數(shù)在適配了Java的類型和方法同時使用Kotlin的語法。其中一些底層的函數(shù) 是使用比較廣泛的

1.apply 函數(shù)

apply函數(shù)可以看做是一個配置函數(shù)。針對apply函數(shù)的調(diào)用者做一些配置,并把調(diào)用者返回。

示例:下面apply的調(diào)用者是file,調(diào)用完之后,返回的還是file,并在apply函數(shù)中,針對file做了一些配置。

    val file = File("d:\\hello.txt").apply {
        setWritable(true)
        setReadable(true)
        setExecutable(false)
    }

apply源碼分析:

1)apply 用inline修飾,是一個內(nèi)聯(lián)函數(shù)。

2)定義了一個<T>泛型,T.apply 調(diào)用者就是T,:T apply返回的類型也是T

上面的file就相當(dāng)于T

3)再看apply的參數(shù):block: T.() -> Unit。這是一個匿名函數(shù),T.()->說明接收的是T的函數(shù)返回的是Unit類型。

4)在apply內(nèi)部 調(diào)用了這個匿名函數(shù)block()也就是T的

5)return this,就是apply 的返回值,返回的是當(dāng)前調(diào)用apply函數(shù)的對象。

public inline fun <T> T.apply(block: T.() -> Unit): T {
    block()
    return this
}

2.let 函數(shù)

let函數(shù)會把調(diào)用者作為參數(shù)傳到lambda表達(dá)式里,可以用it來代替它使用。函數(shù)執(zhí)行完畢,lambda表達(dá)式返回的結(jié)果,就是let函數(shù)返回的結(jié)果。

    val hello = "Hello world".let {
        it.replace("world","kotlin")
    }
    //打印結(jié)果 Hello kotlin
    println(hello)

看下let函數(shù)的定義:

1)let函數(shù)也是一個內(nèi)聯(lián)函數(shù)。

2)定義了兩個泛型<T,R> T.let(),說明T是let的調(diào)用者。

3)block: (T) -> R 說明let接收的是一個匿名函數(shù),匿名函數(shù)的參數(shù)是T,返回值是R

4): R 說明let函數(shù)的返回在也是R,也就是定義的匿名函數(shù)的返回值。

5)return block(this) 把當(dāng)前調(diào)用者當(dāng)做參數(shù)傳進(jìn)來,lambda執(zhí)行結(jié)果返回

上面的示例,調(diào)用let后,會把調(diào)用者當(dāng)做參數(shù)傳遞到匿名函數(shù)也就是lambda中,并把lambda的執(zhí)行結(jié)果,當(dāng)做是let的結(jié)果返回。

inline fun <T, R> T.let(block: (T) -> R): R {
    return block(this)
}

3.run函數(shù)

run函數(shù)和apply差不多,可以給調(diào)用者做配置。唯一的差別是apply返回的是當(dāng)前調(diào)用者對象,而run返回的是lambda執(zhí)行的結(jié)果。

    val text = File("d:\\hello.txt").run {
        setWritable(true)
        setReadable(true)
        setExecutable(false)
        readText()
    }
    println(text)

run函數(shù)分析:

1)run函數(shù)也是一個內(nèi)聯(lián)函數(shù)。

2)有兩個泛型<T,R>,T是當(dāng)前調(diào)用者,R是返回值

3)run接收一個lambda :block: T.() -> R 調(diào)用T的方法,并且把執(zhí)行結(jié)果返回

4): R lambda的執(zhí)行結(jié)果,就是run函數(shù)的執(zhí)行結(jié)果。我們知道lambda默認(rèn)會把最后一行的結(jié)果返回。

5)return block() 返回lambda的執(zhí)行結(jié)果

inline fun <T, R> T.run(block: T.() -> R): R {
    return block()
}

4.with 函數(shù)

with函數(shù)是run的變體,他們的功能是一樣的。唯一的不同是調(diào)用方式,調(diào)用with時,第一個參數(shù)需要傳入一個值參。

    val hello = "Hello World"
    val h2 = with(hello) {
        replace("World", "Kotlin")
    }
    println(h2)

源碼分析:

with接收兩個參數(shù),第一個是傳入的值參,第二個是一個lambda表達(dá)式。

inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    return receiver.block()
}

5.also

also函數(shù)和let函數(shù)類似,also也是把調(diào)用者作為參數(shù)傳遞給lambda,不同點(diǎn)是let返回的是lambda的執(zhí)行結(jié)果,而also返回的是當(dāng)前調(diào)用者對象,這點(diǎn)和apply類似。

這對這個特點(diǎn),可以實現(xiàn)調(diào)用者的鏈?zhǔn)秸{(diào)用。

舉個簡單列子。

雖然對hello做了substring,但并不會改變hello的初始值。因為最后返回的還是調(diào)用者對象本身。

    val hello = "Hello world".also {
        println(it.count())
    }.also{
        println(it.substring(0,5))
    }
    println(hello)

源碼分析:

block: (T) -> Unit also接收一個lambda,這個lambda把調(diào)用者T當(dāng)參數(shù)傳進(jìn)來了,block(this)。

return this 又把當(dāng)前對象返回回去了。

inline fun <T> T.also(block: (T) -> Unit): T {
    block(this)
    return this
}

6.takeIf

takeIf需要判斷l(xiāng)ambda表達(dá)式中結(jié)果,如果true則返回調(diào)用者對象,如果是false,則返回null。

如果需要判斷某個條件是否滿足,再決定是否可以給變量賦值或執(zhí)行某項任務(wù)時,takeIf就很好用。takeIf類似于if語句。

示例:如果flag為true,則給hello賦值“Hello world”。

如果flag為false,則返回null,但是后面又有一個?:判斷,就會給hello賦值“hello null”

    var flag = false
    val hello = "Hello world".takeIf { false } ?: "hello null"
    println(hello)

源碼分析:

從if (predicate(this)) this else null可以看出,如果predicate(this)為true則返回調(diào)用者this否則返回null

 inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
    return if (predicate(this)) this else null
}

通過源碼分析,takeIf也會把調(diào)用者T當(dāng)做參數(shù)傳到lambda中,這樣我們在lambda中就可以針對調(diào)用者做判斷,滿足某些條件則返回調(diào)用者對象,如果不滿足,則返回null。

    val hello = "Hello world".takeIf {
        it.count() > 15
    } ?: "hello kotlin world"
    println(hello)

7.takeUnless

takeUnless剛好和takeIf相反,只有給定條件為false時,才會返回takeUnless調(diào)用者對象,否則返回null。

    val hello = "Hello world".takeUnless {
        it.count() > 15
    } ?: "hello kotlin world"
    println(hello)

源碼:

if (!predicate(this)) 剛好和takeIf中的相反。

inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? {
    return if (!predicate(this)) this else null
}

到此這篇關(guān)于Kotlin標(biāo)準(zhǔn)庫函數(shù)使用分析及介紹的文章就介紹到這了,更多相關(guān)Kotlin標(biāo)準(zhǔn)庫函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Android內(nèi)存泄露及優(yōu)化方案

    詳解Android內(nèi)存泄露及優(yōu)化方案

    這篇文章主要介紹了詳解Android內(nèi)存泄露及優(yōu)化方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Android UI效果之繪圖篇(二)

    Android UI效果之繪圖篇(二)

    這篇文章主要介紹了Android UI效果之繪圖篇,針對Android開發(fā)中的UI效果Canvas進(jìn)行講解,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android WebView實現(xiàn)頂部進(jìn)度條

    Android WebView實現(xiàn)頂部進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android WebView實現(xiàn)頂部進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Android解析JSON數(shù)據(jù)的方法分析

    Android解析JSON數(shù)據(jù)的方法分析

    這篇文章主要介紹了Android解析JSON數(shù)據(jù)的方法,結(jié)合實例形式演示了Android解析json格式數(shù)據(jù)的原理與相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • Android中使用imageviewswitcher 實現(xiàn)圖片切換輪播導(dǎo)航的方法

    Android中使用imageviewswitcher 實現(xiàn)圖片切換輪播導(dǎo)航的方法

    ImageSwitcher是Android中控制圖片展示效果的一個控件。本文給大家介紹Android中使用imageviewswitcher 實現(xiàn)圖片切換輪播導(dǎo)航的方法,需要的朋友參考下吧
    2016-12-12
  • Android 底部導(dǎo)航控件實例代碼

    Android 底部導(dǎo)航控件實例代碼

    這篇文章主要介紹了Android 底部導(dǎo)航控件實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 詳解android與百度echarts項目整合方法

    詳解android與百度echarts項目整合方法

    在本篇文章里我們給大家分享了關(guān)于android與百度echarts項目整合方法和具體步驟,需要的朋友們跟著學(xué)習(xí)下。
    2019-03-03
  • Android用SharedPreferences實現(xiàn)登錄注冊注銷功能

    Android用SharedPreferences實現(xiàn)登錄注冊注銷功能

    這篇文章主要為大家詳細(xì)介紹了Android用SharedPreferences實現(xiàn)登錄注冊注銷功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • ListView的Adapter使用 之 初學(xué)ArrayAdapter String

    ListView的Adapter使用 之 初學(xué)ArrayAdapter String

    ListView是Android中經(jīng)常會使用的東西,綁定數(shù)據(jù)對于初學(xué)者來說,尤其是剛接觸編程的人來說,往往會覺得很難理解,我上大二的時候?qū)W的java,但是基本上相當(dāng)于沒有學(xué),什么都沒寫過,真正接觸編程就是開始上手學(xué)android,把這些記錄下來,自己可以回頭看下,也可以讓新手更好的理解
    2013-06-06
  • Android使用xUtils3.0實現(xiàn)文件上傳

    Android使用xUtils3.0實現(xiàn)文件上傳

    這篇文章主要為大家詳細(xì)介紹了Android使用xUtils3.0實現(xiàn)文件上傳的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評論

嘉鱼县| 西丰县| 卢氏县| 商洛市| 北辰区| 静安区| 九龙县| 阿拉善盟| 金坛市| 琼结县| 资溪县| 大宁县| 安庆市| 惠州市| 朔州市| 桦川县| 磴口县| 缙云县| 佳木斯市| 韶山市| 格尔木市| 德州市| 浪卡子县| 砚山县| 白沙| 榆树市| 鹿泉市| 汶川县| 颍上县| 商都县| 广元市| 乡宁县| 万安县| 葫芦岛市| 县级市| 麦盖提县| 家居| 临洮县| 凤冈县| 高邑县| 喀喇沁旗|