一、? 与 !! 的比较
val a: String = "aa" /* * a是非空类型,下面的给a赋值为null将会编译不通过 * */ // a = null a.length /* * ?声明是可空类型,可以赋值为null * */ var b: String? = "bb" b = null /* * b是可空类型,直接访问可空类型将编译不通过,需要通过?.或者!!.来访问 * */ // b.length b?.length b!!.length
/*
* 不推荐这样的写法:链式的连续用!!.
* */
val user = User()
user!!.name!!.subSequence(0,5)!!.length
二、let语句简化对可空对象对访问
* 通过let语句,在?.let之后,如果为空不会有任何操作,只有在非空的时候才会执行let之后的操作 * */ user?.let { it.name it.age it.toString() }
三、?: 简化对空值的处理
?:符号会在符号左边为空的情况才会进行下面的处理,不为空则不会有任何操作。跟?.let正好相反,例如我们可以用两行代码来简化上面从操作:
/**
* Elvis操作符 ?: 简化对空值的处理
*/
fun testElvis2(input: String?, user: User?) {
val b = input?.length ?: -1;
user?.save() ?: User().save()
}