3.2 可空类型

或许Java和Android开发者早已厌倦了空指针异常(Null Pointer Exception)。因为其在运行时总会在某个意想不到的地方忽然出现,让开发者感到措手不及。

那么为何开发者不能在编译时就提前发现这类空指针异常,并大量修复这些问题呢?现代编程语言正是这么做的。Kotlin自然也不例外。在Java 8中,我们可以使用Optional类型来表达可空的类型。

运行程序,输出如下:

    3
    0

但是这样的代码依然不是那么“优雅”。

针对这方面,Groovy提供了一种安全的属性/方法访问操作符“?.”:

    user?.getUsername()?.toUpperCase(); //安全调用符 ?.

Swift也有类似的语法,只作用在Optional的类型上。

Kotlin中使用了Groovy里面的安全调用符,并简化了Optional类型的使用,直接通过在类型T后面加个“?”,就表达了Optional的意义。

上面Java 8的例子用Kotlin来写就显得更加简单、“优雅”了:

其中,我们使用String?同样表达了Optional的意思,相比之下,哪种方式更简单?答案一目了然。

还有Java 8的Optional提供的orElse:

    s.orElse("").length();

其在Kotlin中是最最常见的Elvis运算符了:

    s?.length ?: 0

相比之下,我们还有什么理由继续用Java 8的Optional呢?