Kotlin常用函數let,with,run,apply用法與區別案例詳解

在kotlin編程中let、with、run、apply這些函數使用率是非常高的,有時候可以通用,差別很小,但如果能記住他們的不同點,可以更加合理的選擇使用。

在這之前首先要瞭解一下Lambda表達式的一些規則,這會幫助你理解使用這些函數的時候有沒有( )可不可以用it代替參數等。因為這些函數的最後一個參數都是lambda。

如何理解lambda呢?可以把lambda理解為就是一個對象,但這個對象比較特殊,它是一段代碼,既然是對象就可以作為函數的參數使用。這種對象稱為函數對象。
lambda表達式的語法格式舉例:
{ x: Int, y: Int -> x + y }
lambda 表達式是括在“{ }”中, “ ->” 前面為lambda參數,後面為函數體。為瞭方便理解用普通函數推導一下變化過程:

fun sum(x: Int, y: Int) = x + y

首先去掉瞭關鍵字fun和方法名:

(x: Int, y: Int) = x + y

之後分為瞭2部分,“=” 前面作為lambda參數,後面作為函數體,中間用“->” 代替:

(x: Int, y: Int) ->  x + y

最後去掉參數的小括號,在外面加上大括號:

{x: Int, y: Int ->  x + y}

最終得到的lambda表達式就可以作為參數使用瞭:

fun useLambda(a: Int, {x: Int, y: Int ->  x + y}){
  ...代碼省略...
}

瞭解瞭基礎的語法格式後,在來看下,lambda的幾個重要規則:
Kotlin規則1:如果函數的最後一個參數是lambda,lambda 表達式可以放在圓括號之外(拖尾 lambda):

val result = useLambda(a: Int){x: Int, y: Int ->  x + y}

Kotlin規則2:如果函數隻有lambda一個參數時候,圓括號可以省略:

修改瞭useLambda函數:
fun useLambda({str: String ->  str.length}){
  ...代碼省略...
}
規則1改為:
val result = useLambda(){str: String ->  str.length}
規則2改為:
val result = useLambda{str: String ->  str.length}

Kotlin規則3:如果lambda表達式隻有一個參數時候,不用聲明參數,可以用隱式名稱it代替參數:

val result = useLambda{it.length}

Kotlin規則4:lambda表達式中有參數未使用的時候,可用下劃線“_” 代替

useLambda(){_, y ->  y * y}

瞭解瞭lambda表達式之後再來分析函數
let函數用法:

val result = obj.let {
   //TODO 使用it訪問obj對象的方法或者屬性
   it.xxx()
   //TODO 最後一行代碼的結果為返回值賦值給result
}

從let函數寫法和lambda的規則可以看出,它隻有一個lambda參數,並且這個lambda的參數也隻有一個,就是調用者對象本身。let最常用於判斷對象空指針之後有連續操作的場景。舉例:

obj?.let{
   it.dosomething1()
   it.dosomething2()
   it.dosomething3()
}

with函數用法:

val result = with(obj) {
//TODO 直接訪問obj對象的方法或者屬性,或者使用this.調用
//TODO 最後一行代碼的結果為返回值賦值給result
}

同樣我們可以看出,with函數有2個參數,第一個參數為要處理的對象,最後一個是lambda參數,根據規則1,放在瞭圓括號後邊。在這個lambda表達式中提供瞭第一個參數的對象可以用this指定,也可以省略。

run函數用法:

val result = obj.run{
//TODO 直接訪問obj對象的方法或者屬性,或者使用this.調用
//TODO 最後一行代碼的結果為返回值賦值給result
}

run函數隻有一個lambda參數,run看上去是let與with的結合。因為run可以解決判空調用還可以去掉“it”解決let函數隱式名稱調用問題。

apply函數用法:

val result = obj.apply{
//TODO 直接訪問obj對象的方法或者屬性,或者使用this.調用
}

可以看出與run函數幾乎一樣,唯一的區別是lambda中沒有指定返回值。返回的是調用者對象本身,也就是obj。

總結:

函數 參數個數 內部訪問上下文對象 返回值
let 1 it lambda最後一行代碼返回值
with 2 this 或者 省略 lambda最後一行代碼返回值
run 1 this 或者 省略 lambda最後一行代碼返回值
apply 1 this 或者 省略 返回調用者對象

到此這篇關於Kotlin常用函數let,with,run,apply用法與區別案例詳解的文章就介紹到這瞭,更多相關Kotlin常用函數let,with,run,apply用法與區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: