您好,登錄后才能下訂單哦!
本篇文章為大家展示了kotlin Standard中的內聯函數,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
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中的內聯函數,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。