![Kotlin从入门到进阶实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/633/26793633/b_26793633.jpg)
上QQ阅读APP看书,第一时间看更新
3.2 可空类型
或许Java和Android开发者早已厌倦了空指针异常(Null Pointer Exception)。因为其在运行时总会在某个意想不到的地方忽然出现,让开发者感到措手不及。
那么为何开发者不能在编译时就提前发现这类空指针异常,并大量修复这些问题呢?现代编程语言正是这么做的。Kotlin自然也不例外。在Java 8中,我们可以使用Optional类型来表达可空的类型。
![](https://epubservercos.yuewen.com/317ECE/15253386404112206/epubprivate/OEBPS/Images/Figure-P57_41512.jpg?sign=1738828182-P4B8MtXDxYoldGxapqJ16mxdXSaEqBSO-0-698335cd7940fc8815737caf13301624)
运行程序,输出如下:
3 0
但是这样的代码依然不是那么“优雅”。
针对这方面,Groovy提供了一种安全的属性/方法访问操作符“?.”:
user?.getUsername()?.toUpperCase(); //安全调用符 ?.
Swift也有类似的语法,只作用在Optional的类型上。
Kotlin中使用了Groovy里面的安全调用符,并简化了Optional类型的使用,直接通过在类型T后面加个“?”,就表达了Optional的意义。
上面Java 8的例子用Kotlin来写就显得更加简单、“优雅”了:
![](https://epubservercos.yuewen.com/317ECE/15253386404112206/epubprivate/OEBPS/Images/Figure-P58_41518.jpg?sign=1738828182-Qks9roiaoQNFNyarHCdOsU6V3EnsM8eQ-0-6385cd79dbca629f28c7304e5eac0b8b)
其中,我们使用String?同样表达了Optional的意思,相比之下,哪种方式更简单?答案一目了然。
还有Java 8的Optional提供的orElse:
s.orElse("").length();
其在Kotlin中是最最常见的Elvis运算符了:
s?.length ?: 0
相比之下,我们还有什么理由继续用Java 8的Optional呢?