一. 定义
let辅助工具, let是一个函数。它提供了函数式API的编程接口, 并将原始调用对象作为参数传递到Lambda表达式中。
语法如下:
obj.let{
obj_ ->
... //用户业务逻辑
}
这里调用了obj对象的let函数,然后Lambda表达式中的代码主会立即执行,并且这个obj对象本身还会作为参数传递到Lambda表达式中。不过,为了防止变量重名,这里将参数名改成了obj_, 实际上是同一个对象, 这就是let函数的作用。
let函数属于Kotlin中的标准函数。
二. 作用, let函数的 一个作用是与?.配合,可以在空指针检查 有效。
fun doLearn(learn: Learn?){
learn?.let{
learn_ ->
learn_.readBooks()
learn_.doSchoolwork()
}
}
?.表示对象为空时什么都不做, 对象不为空时就调用let函数, 而let函数会交learn对象本身作为参数传递到Lambda表达式中,此时的learn对象肯定不空了。
当Lambda表达式的参数列表中只有一个参数时,可以不用声明参数名, 直接使用it关键字来代替即可,上述代码可以进一步简化成:
fun doLearn(learn: Learn?){
learn?.let {
it.readBooks()
it.doSchoolwork()
}
}
三. let函数是可以处理全局变量的判空问题的,但是使用 if 判断 则无法做到这一点。 例如我们将doLearn()的参数变成一个全局变量,使用 let函数仍然可以正常工作, 但使用 if 判断则会报错。
var learn: Learn? =null
fun doLearn(){
learn?.let {
it.readBooks()
it.doSchoolwork()
}
}
使用if判断
报错原因是: 全局变量的值随时都有可能被其他线程修改, 即使作了判断空处理,也无法保证if语句中的learn没有空指针风险。