kotlin Standard中的內聯函數示例詳解

這篇文章主要給大家介紹了關於kotlin Standard中內聯函數的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用kotlin具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

let、with、run、apply、also、takeIf、takeUnless、repeat函數的使用

kotlin Standard.kt文件中,提供了一些內聯函數,這些內聯函數可以減少代碼量,在使代碼優美的同時,打打提高開發效率。它們分別爲:

run、with、let、also、apply

let

let函數的定義如下:

public inline fun <T, R> T.let(block: (T) -> R): R = block(this)

默認當前這個對象作爲閉包的it參數,函數接受一個lambda函數塊返回值是函數裏面最後一行,或者指定return
let函數的一般結構爲:

obj.let {
 it.todo//it指代obj對象實例
 ...
}
//在需要判斷obj是否爲null時
obj?.let {
 it.todo//it指代obj對象實例
 ...
}

使用實例:初始化user

 val user = User()
 val result= user.let {
   it.account = "12306"
   it.address = "粵海街道"
   it.address
}
println(result)
//運行結果
>>粵海街道

適用場景:

  • 用let函數處理需要針對一個可null的對象統一做判空處理
  • 明確一個變量所在特定作用域的範圍

with

with函數的定義如下:

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

with函數不是以擴展函數的形式存在,它是將對象作爲參數,在函數塊內通過this指代該對象。with函數是接收了兩個參數,分別爲對象receiver和一個lambda函數塊,返回值爲函數塊的最後一行或指定return表達式。
with的一般結構爲:

with(obj){
  this.todo
  todo//this可省略
  ...
}

使用實例:將地址影射到UI上

with(user){
 tView.text = address
}

適用範圍:

適用於調用一個類的多個方法,可以省去對象名直接調用方法(例如將數據影射到ui上時)

run

run函數的定義如下:

public inline fun <T, R> T.run(block: T.() -> R): R = block()

run函數接受一個lambda函數塊,以閉包的形式返回函數塊的最後一行或指定return表達式。觀察函數的定義可以發現,run函數爲一個擴展函數,而其接受的參數和with函數第二個參數相同,run函數可以理解爲let函數和with函數的結合體。
run函數的一般結構爲:

obj.run {
  this.todo
  todo//this可省略
  ...
}

使用實例:將地址影射到UI上

user.run {
 tView.text = address
}

適用範圍:

適用於let和run函數的場景,run函數相較於let函數省去了必須適用it指代參數的麻煩,相較於with函數彌補了對象判空的問題

also

also函數的定義如下:

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

also函數的定義和let函數的類似,只是also函數返回的爲傳入對象的本身。

also函數的一般結構和使用方法和let函數類似:

obj.also {
  it.todo//it指代obj對象實例
  ...
}
//在需要判斷obj是否爲null時
obj?.let {
  it.todo//it指代obj對象實例
  ...
}

適用範圍:

also函數返回值微傳入方法的對象本身,所以可用來進行函數的鏈式調用

apply

apply函數的定義如下:

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

apply函數的定義和run函數的類似,唯一的區別就是apply函數返回的爲傳入對象的本身。

apply函數一般結構如下:

apply函數一般結構如下:
obj.apply {
  this.todo
  todo//this可省略
  ...
}

使用實例:給對象賦值

var user = User().apply {
      account = "12306"
    }

適用場景:

apply函數和run函數除了返回值外,整體功能和作用類似,一般用於對象初始化時對屬性進行賦值。

總結:

這裏我們總結對比一下這五個函數,這五個函數的特性非常簡單,區別也無非是接受的參數和返回的類型不同。其中,對於with,run,apply接收者是this(可以省略),而let和also則使用it接受且不可s省略對於;

對於with,run,let返回值是返回值是函數裏面最後一行,或者指定return,而apply和also返回值是調用者本身。

函數名 接受者 返回值
let it 最後一行
with this 最後一行
run this 最後一行
also it 調用者本身
apply this 調用者本身

如何選擇可以參考下圖

takeIf、takeUnless、repeat

takeIf & takeUnless

takeIf函數的定義如下:

public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null

可以看出:takeIf函數接受一個入參類型爲調用者的類型T,返回值爲Boolean類型的lambda函數塊。takeIf函數根據lambda函數返回值返回的數據,爲true返回調用者本身,否則返回null

takeUnless函數的定義如下:

public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null

不難看出,takeUnless相對比takeIf只是在返回值調用predicate(this)進行了取反操作,takeUnless的作用效果和takeIf正好相反!

takeIf函數一般結構如下:

obj.takeIf{
  ...
  true/fals
}

使用實例:

//根據age爲user賦值,若age在1-100之間,爲user.age賦值age,否則user.age爲null
var age
...
user.age = age.takeIf { 
  age in 1..99
}.toString()

user.age = age.ta { 
  age in 100..0
}.toString()

repeat

repeat函數的定義如下:

public inline fun repeat(times: Int, action: (Int) -> Unit) { for (index in 0 until times) { action(index) } }

函數接受一個int類型數據times,和一個入參爲int類型,無返回值的lambda函數action,並通過for循環重複的調用times次action函數

函數的一般結構如下:

repeat(int){
  todo
}

使用實例:

//快速的爲list添加十條數據
var list = ArrayList<User>()
repeat(10){
  list.add(User())
}

適用場景:該函數可以用來避免寫循環語句,可以用來遍歷數據。

結語:

Kotlin Standard.kt中的標準庫函數已基本講解完畢,其中涉及到了高階函數和lambda函數,相關知識可通過官方文檔學習,同時建議讀者將每個函數都實際敲一遍,並通過查看他們編譯後的class文件加深對函數的理解。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對神馬文庫的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章