Kotlin學習路(三):標準函數with、run、apply

<本文學習郭神《第三行代碼》總結>

1、with

with函數接受兩個參數:
(1)第一個參數是任意類型對象
(2)第二個參數是Lambda表達式
with函數會在lambda表達式中提供第一個參數對象的上下文,並使用Lambda表達式中的最後一行代碼作爲返回值返回。

val result = with(obj){	//obj上下文
"value"	//with函數返回值
}

它可以再連續調用同一個對象的多個方法時讓代碼更簡潔。
比如,打印一個集合中的數據,可以通過遍歷集合,使用StringBuilder字符串拼接,然後打印。

val list5 = listOf("a", "b", "c")
val sb = StringBuilder()
for (string in list5){
    sb.append(string + "\n")
}
val result = sb.toString()
print(result)

但這裏就連續多次調用了sb的方法,如果用with替換,應該怎麼寫呢,現在看一下吧。

val list5 = listOf("a", "b", "c")
val result = with(StringBuilder()){
    for (string in list5){
        append(string)
    }
    toString()
}
print(result)

首先給with傳一個StringBuilder對象參數,那麼Lambda表達式就會是StringBuilder的對象,所以在Lambda表達式中就可以直接調用append()和toString()方法,Lambda表達式最後一行代碼作爲with的返回值。

2、run

run函數的用法和使用場景和with類似。
它們不同的地方在於:
(1)run函數不能直接調用,需要通過調用某個對象的run函數。
(2)run函數只接收一個Lambda參數,並且會在Lambda表達式中提供對
象上下文。

val result = obj.run() {	//obj上下文
"value"	//with函數返回值
}

所以上述代碼就可更改成:

val list5 = listOf("a", "b", "c")
val result1 = StringBuffer().run(){
    for (string in list5){
        append(string)
    }
    toString()
}
print(result)

只是將調用with函數並傳入StringBuilder對象改成了調用StringBuilder對象的run方法。

3、apply

apply函數和run函數類似。
它們不同的地方在於:
(1)apply函數無法指定返回值

val result = obj.apply {	//obj上下文

}	//  result == obj

上述代碼就可以修改爲:

val list5 = listOf("a", "b", "c")
val result2 = StringBuilder().apply { 
    for (string in list5){
        append(string)
    }
}
print(result.toString())

由於apply函數無法指定返回值,只能返回對象本身,所以,這裏的result實際上是StringBuilder對象,在打印時候,必須要調用toString方法才行。

所以Activity頁面帶參跳轉時,Intent傳入參數,就可以改成

val intent = Intent().apply {
putExtra("parm1", parm1)
putExtra("parm2", parm2)
}
startActivity(intent)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章