天天看点

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/

继续阅读