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/

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