kotlin内联函数let、with、run、apply、also

359 阅读1分钟

最近面试被问到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或指定名称 返回调用者本身

更多细节请参考官方文档kotlinlang.org/docs/refere…