最近面试被问到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/