天天看點

kotlin内聯函數let、with、run、apply、also

最近面試被問到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/

繼續閱讀