欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin作用域函數(shù)使用示例詳細(xì)介紹

 更新時(shí)間:2023年02月17日 15:04:43   作者:破浪會(huì)有時(shí)  
作用域函數(shù):是Kotlin標(biāo)準(zhǔn)庫(kù)中的內(nèi)聯(lián)函數(shù),作用在對(duì)象上時(shí),執(zhí)行給定的block代碼塊??梢栽赽lock代碼塊中通過(guò)it,this代表當(dāng)前對(duì)象,進(jìn)行代碼邏輯處理

這里我們將介紹Kotlin 5個(gè)作用域函數(shù):let,run,with,apply,also。

1 let

let 可用于范圍界定和空值檢查。在對(duì)象上調(diào)用時(shí),let 執(zhí)行給定的代碼塊并返回其最后一個(gè)表達(dá)式的結(jié)果。對(duì)象可通過(guò)引用它(默認(rèn)情況下)或自定義名稱在塊內(nèi)進(jìn)行訪問(wèn)。

所以,總結(jié)起來(lái),let 有如下三大特征:

// 重點(diǎn)11:使用it替代object對(duì)象去訪問(wèn)其公有的屬性 & 方法
object.let{
   it.todo()
}
// 重點(diǎn)2:判斷object為null的操作
object?.let{//表示object不為null的條件下,才會(huì)去執(zhí)行l(wèi)et函數(shù)體
   it.todo()
}
// 重點(diǎn)3:返回值 = 最后一行 / return的表達(dá)式

下面是一些例子(我們可以直接在 Kotlin Playground 中運(yùn)行):

fun customPrint(s: String) {
    print(s.uppercase())
}
fun main() {
    val empty = "test".let {               // Calls the given block on the result on the string "test".
        customPrint(it)                    // 這里的 it 就是 "test",所以 "test" 作為輸入給到 customPrint 函數(shù)中,打印出大寫(xiě)的 "test"
        it.isEmpty()                       // let 最后返回的是這個(gè),也就是 empty 最終的值是 false
    }
    println(" is empty: $empty")           // 打印結(jié)果 TEST is empty: false。這里的 TEST 是 customPrint 函數(shù) 的打印結(jié)果。注意 print 和 println 的區(qū)別
    fun printNonNull(str: String?) {
        println("Printing \"$str\":")
        str?.let {                         // object不為null的條件下,才會(huì)去執(zhí)行l(wèi)et函數(shù)體
            print("\t")
            customPrint(it)
            println()                      // 換行。let最后返回的是這一行
        }
    }
    fun printIfBothNonNull(strOne: String?, strTwo: String?) {
        strOne?.let { firstString ->       
            strTwo?.let { secondString ->
                customPrint("$firstString : $secondString")
                println()
            }
        }
    }
    printNonNull(null)                    // 打印 Printing "null":
    printNonNull("my string")             // 打印 Printing "my string":
	                                      // MY STRING
    printIfBothNonNull("First","Second")  // 打印 FIRST : SECOND
}

從另一個(gè)方面,我們來(lái)比對(duì)一下不使用 let 和使用 let 函數(shù)的區(qū)別。

// 使用kotlin(無(wú)使用let函數(shù))
mVar?.function1()
mVar?.function2()
mVar?.function3()
// 使用kotlin(使用let函數(shù))
// 方便了統(tǒng)一判空的處理 & 確定了mVar變量的作用域
mVar?.let {
       it.function1()
       it.function2()
       it.function3()
}

2 run

與 let 函數(shù)類似,run 函數(shù)也返回最后一條語(yǔ)句。另一方面,與 let 不同,運(yùn)行函數(shù)不支持 it 關(guān)鍵字。所以,run 的作用可以是:

  • 調(diào)用同一個(gè)對(duì)象的多個(gè)方法 / 屬性時(shí),可以省去對(duì)象名重復(fù),直接調(diào)用方法名 / 屬性即可
  • 定義一個(gè)變量在特定作用域內(nèi)
  • 統(tǒng)一做判空處理

下面是一些例子:

fun main() {
    fun getNullableLength(ns: String?) {
        println("for \"$ns\":")
        ns?.run {                                                  // 判空處理
            println("\tis empty? " + isEmpty())                    // 這里我們就發(fā)現(xiàn),在 isEmpty 前不再需要 it
            println("\tlength = $length")                           
            length                                                 // run returns the length of the given String if it's not null.
        }
    }
    getNullableLength(null)   
    // 打印 for "null":
    getNullableLength("")
    // 打印 for "":
    //         is empty? true
    //         length = 0
    getNullableLength("some string with Kotlin")
    // 打印 for "some string with Kotlin":
    //         is empty? false
    //         length = 23
    data class People(val name: String, val age: Int) 
    val people = People("carson", 25)
    people?.run{
      println("my name is $name, I am $age years old")
      // 打?。簃y name is carson, I am 25 years old
    }
}

3 with

with 是一個(gè)非擴(kuò)展函數(shù),可以簡(jiǎn)潔地訪問(wèn)其參數(shù)的成員:我們可以在引用其成員時(shí)省略實(shí)例名稱。所以說(shuō),run 相當(dāng)于 let 和 with 的集合。

class Configuration(var host: String, var port: Int) 
fun main() {
    val configuration = Configuration(host = "127.0.0.1", port = 9000) 
    with(configuration) {
        println("$host:$port")   // 打印 127.0.0.1:9000
    }
    // instead of:
    println("${configuration.host}:${configuration.port}")    // 打印 127.0.0.1:9000
}

4 apply

apply 對(duì)對(duì)象執(zhí)行代碼塊并返回對(duì)象本身。在塊內(nèi)部,對(duì)象由此引用。此函數(shù)對(duì)于初始化對(duì)象非常方便。所以再重復(fù)一遍,apply函數(shù)返回傳入的對(duì)象的本身。

data class Person(var name: String, var age: Int, var about: String) {
    constructor() : this("", 0, "")
}
fun main() {
    val jake = Person()                   
    val stringDescription = jake.apply {  
        // Applies the code block (next 3 lines) to the instance.
        name = "Jake"                                   
        age = 30
        about = "Android developer"
    }.toString()                            
    println(stringDescription)      // 打印 Person(name=Jake, age=30, about=Android developer)
}

5 also

類似 let 函數(shù),但區(qū)別在于返回值:

  • let 函數(shù):返回值 = 最后一行 / return的表達(dá)式
  • also 函數(shù):返回值 = 傳入的對(duì)象的本身
// let函數(shù)
var result = mVar.let {
               it.function1()
               it.function2()
               it.function3()
               999
}
// 最終結(jié)果 = 返回999給變量result
// also函數(shù)
var result = mVar.also {
               it.function1()
               it.function2()
               it.function3()
               999
}
// 最終結(jié)果 = 返回一個(gè)mVar對(duì)象給變量result

另一個(gè)類似的例子:

data class Person(var name: String, var age: Int, var about: String) {
             constructor() : this("", 0, "")
}
fun writeCreationLog(p: Person) {
    println("A new person ${p.name} was created.")              
}
fun main() {
    val jake = Person("Jake", 30, "Android developer")   // 1
        .also {                                          // 2 
            writeCreationLog(it)                         // 3
        }
    println(jake)   
    // 最終打?。?
    // A new person Jake was created.
    // Person(name=Jake, age=30, about=Android developer)
}

到此這篇關(guān)于Kotlin作用域函數(shù)使用示例詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Kotlin作用域函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android自定義View實(shí)現(xiàn)圓形環(huán)繞效果

    Android自定義View實(shí)現(xiàn)圓形環(huán)繞效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓形環(huán)繞效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android自定義控件(實(shí)現(xiàn)視圖樹(shù)繪制指示器)

    Android自定義控件(實(shí)現(xiàn)視圖樹(shù)繪制指示器)

    本文主要介紹了Android視圖樹(shù)繪制指示器的實(shí)現(xiàn)原理和具體步驟。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Android多級(jí)樹(shù)形列表控件

    Android多級(jí)樹(shù)形列表控件

    這篇文章主要為大家詳細(xì)介紹了Android多級(jí)樹(shù)形列表控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android NDK開(kāi)發(fā)入門(mén)

    Android NDK開(kāi)發(fā)入門(mén)

    本文主要對(duì)NDK產(chǎn)生的背景、使用NDK原因、NDK簡(jiǎn)介、NDK開(kāi)發(fā)環(huán)境的搭建、如何運(yùn)行NDK提供的事例demo等進(jìn)行了詳細(xì)的介紹。具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧
    2016-12-12
  • Android互聯(lián)網(wǎng)訪問(wèn)圖片并在客戶端顯示的方法

    Android互聯(lián)網(wǎng)訪問(wèn)圖片并在客戶端顯示的方法

    這篇文章主要介紹了Android互聯(lián)網(wǎng)訪問(wèn)圖片并在客戶端顯示的方法,結(jié)合實(shí)例分析了Android處理圖片的技巧,并附帶了Android的URL封裝類,網(wǎng)絡(luò)連接封裝類與輸出流封裝類,需要的朋友可以參考下
    2015-12-12
  • 關(guān)于Touch Panel AA區(qū)要做外擴(kuò)的原因解析

    關(guān)于Touch Panel AA區(qū)要做外擴(kuò)的原因解析

    今天小編就為大家分享一篇關(guān)于Touch Panel AA區(qū)要做外擴(kuò)的原因解析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • android studio集成ijkplayer的示例代碼

    android studio集成ijkplayer的示例代碼

    本篇文章主要介紹了android studio集成ijkplayer的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Android組件content provider使用解析

    Android組件content provider使用解析

    這篇文章主要為大家詳細(xì)解析了Android組件content provider的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊效果

    Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊效果

    在Android開(kāi)發(fā)中常常會(huì)用到高斯模糊,但有的時(shí)候我們可能會(huì)需要一個(gè)圖片以不同的模糊程度展現(xiàn)出來(lái),那如何實(shí)現(xiàn)呢,一起通過(guò)本文來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2016-08-08
  • Android獲取窗體信息的Util方法

    Android獲取窗體信息的Util方法

    這篇文章主要介紹了Android獲取窗體信息的Util方法的相關(guān)資料,需要的朋友可以參考下
    2015-07-07

最新評(píng)論