Kotlin-判空辅助工具(标准函数let)
1、?.操作符:当对象不为空时正常调用相应的方法,当对象为空时则什么都不做。
if(a != null){
a.doSomething()
}
可以使用?.操作符简化
a?.doSomething()
优化doStudy()函数
fun doStudy(study: Study?){
study?.readBooks()
study?.doHomework()
}
2、?:操作符:操作符左右两边都接收一个表达式,如果左边表达式的结果不为空就返回左边表达式的结果,否则就返回右边表达式的结果。
val c = if(a != null){
a
} else {
b
}
使用?:操作符简化
val c = a ?: b
3、编写一个函数用来获得一段文本的长度
fun getTextLength(text: String?): Int{
if(text != null){
return text.length
}
return 0
}
用?.和?: 简化之后
fun getTextLength(text: String?) = text?.length ?: 0//首先由于text是可能为空的,因此在调用它的length字段时需要使用?.操作符,而当text为空时,text?.length会返回一个null值,这个时候再借助?:操作符让它返回0
4、如果想要强行通过编译,可以使用非空断言工具,写法是在对象的后面加上!!
var content: String? = "hello"
fun main(){
if(content != null){//从逻辑上已经将空指针异常处理了,但是编译器并不知道,还是编译失败
printUpperCase()
}
fun printUpperCase(){//函数并不知道外部已经对content变量进行了非空检查,在调用toUpperCase()方法时,还认为这里存在空指针风险,从而无法编译通过
val upperCase = content.toUpperCase()
println(upperCase)
}
}
fun printUpperCase(){
val upperCase = content!!.toUpperCase()//这是一种有风险的写法
println(upperCase)
}
5、let:let既不是操作符,也不是关键字,而是一个函数,这个函数提供了函数式API的编程接口,并将原始调用对象作为参数传递到Lambda表达式中。
obj.let{ obj2 ->
//编写具体的业务逻辑
}//这里调用了obj对象的let函数,然后Lambda表达式中的代码就会立即执行,并且这个obj对象本身还会作为参数传递到Lambda表达式中,为了防止重名,将参数改为了obj2,但是实际上它们是同一个对象
用let简化doStudy()函数:
fun doStudy(study: Study?){
study?.let { stu ->
stu.readBooks()
stu.doHomework()
}
}
当Lambda表达式的参数列表中只有一个参数时,可以不用声明参数名,直接使用it关键字来代替即可:
fun doStudy(study: Study?){
study?.let{
it.readBooks()
it.doHomework()
}
}
6、let函数是可以处理全局变量的判空问题,而if判断语句则无法做到。因为全局变量的值随时有可能被其他线程修改,即使做了判空处理,仍然无法保证if语句的study变量没有空指针风险。