最近面试被问到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的变种,他返回调用者本身。

总结

内联函数内部调用返回值
letit或指定名称返回值为最后一行执行结果或return表达式
withthis或者省略返回值为最后一行执行结果或return表达式
runthis或者省略返回值为最后一行执行结果或return表达式
applythis或者省略返回调用者本身
alsoit或指定名称返回调用者本身

更多细节请参考官方文档https://kotlinlang.org/docs/reference/

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐