最近面試被問到kotlin内聯函數,這裡作個簡單的總結
let
在函數體内通路該對象中的屬性或方法
iv_back_activity_clock.let {
it.adjustViewBounds = true
it.scaleType = ImageView.ScaleType.FIT_XY
}
判斷調用者是否為null (常用)
var text: String? = null
text?.let { setText(it) }
傳回值為最後一行執行結果或return表達式
with
常用反複調用同一個類的方法,可以省去重複書寫這類。比如在 RecyclerView.ViewHolder中
不用with時
holder.tvName.text = "zhangsan"
holder.tvCancel.setOnClickListener {
//TODO
}
使用with
with(holder) {
tvName.text = "zhangsan"
tvCancel.setOnClickListener {
//TODO
}
}
傳回值為最後一行執行結果或return表達式
run
可以了解成let 跟 with的結合體
不用run之前
if (holder == null) return
with(holder) {
tvName.text = "zhangsan"
tvCancel.setOnClickListener {
}
}
使用run之後
holder?.run {
tvName.text = "zhangsan"
tvCancel.setOnClickListener {
}
}
可以看出run可用于判空以及反複調用該對象屬性方法,傳回值為最後一行執行結果或return表達式
apply
跟run差不多,apply傳回調用者本身,常用在初始化對象,比如初始化自定義dialog
不寫apply
CircleDialog.Builder()
.setTitle("警告")
.setTitleColor(Color.RED)
.setPositive("離開", {
//TODO
}).setNegative("我不", {
//TODO
}).show(supportFragmentManager)
使用apply函數
CircleDialog.Builder().apply {
title = "警告"
titleColor = Color.RED
setPositive("離開",{
//TODO
})
setNegative("我不",{
//TODO
})
}.show(supportFragmentManager)
also
also可以了解為let的變種,他傳回調用者本身。
總結
内聯函數 | 内部調用 | 傳回值 |
---|---|---|
let | it或指定名稱 | 傳回值為最後一行執行結果或return表達式 |
with | this或者省略 | 傳回值為最後一行執行結果或return表達式 |
run | this或者省略 | 傳回值為最後一行執行結果或return表達式 |
apply | this或者省略 | 傳回調用者本身 |
also | it或指定名稱 | 傳回調用者本身 |
更多細節請參考官方文檔https://kotlinlang.org/docs/reference/