kotlin函数的判空检查都是在编译期的
可空类型 (s:String?)
问号可以加在任何类型的后面来标识这个类型的变量可以存储null引用:
Type?= Type or null (可空类型的变量可以存储null引用)
允许参数可空后,一些操作将会受到限制
- 不能调用自身的方法
- 不能把它赋值给非空类型的变量
- 不能把可空类型的值传给拥有非空类型参数的函数
安全调用运算符 : "?."
?. 允许吧一次null检查和一次方法调用合并成一个操作。安全调用不光可以调用方法,也能用来访问属性
type?.type => if(type !=null){ type.type}else{ null}
Elvis 运算符 : “?:”
kotlin 用Elvis运算符来提供null的默认值
var s:String= type?:string => if(type==null){ s=string}else{ s=type}
可以用在return和throw返回参数
安全转换 : “as?”
在java中类型转换错误会抛出 ClassCastException 异常</br>
as?运算符尝试把值转换成制定类型,没有合适的类型就返回null
troll as?Type => if(troll is Type){ troll as Type}
if(troll !is Type){ null}
非空断言 : “ !!”
非空断言是kotlin最简单的处理可空类型值的工具
type !! => if(type !=null){ type} else{NullPointerException}
“let”函数
let函数可以处理可空表达式变得更加简繁,和安全调用运算符一起,允许对表达式求值,检查求值结果是否为null,并且把结果保存为一个变量
type ?.let{相应的处理} => if(type !=null){ 进行lambda内部相对应处理}else{ 什么都不发生}
延迟初始化属性 lateinit
Android 中,Activity的初始化发生在onCreate方法中
延迟初始化的属性都是var,因为需要在构造方法外修改它的值,而val属性会被编译成必须在构造方法中初始化的final字段。</br>
lateinit 属性常见是依赖注入,lateinit属性的值是被依赖注入框架从外部设置的, 为了保证和各种Java(依赖注入)框架的兼容性,Kotlin会自动生成一个和lateinit属性具有相同可见性的字段。
可空类型的扩展
可空类型定义扩展函数是一种强大的处理null值的方式,允许接收者为null的扩展函数调用,并在改函数中处理null,而不是在确保变量不为null之后再调用它的方法。
- String的标准函数库中有isEmpty和isBlank