为什么我们要使用Kotlin

Posted by 阿呆 on 2019-06-22

前言

自从Google在I/O上宣布Kotlin成为Android的语言,它已经成为一种趋势,翻看Google开源的各种新的库以及示demo,都是使用Kotlin来编写的,那么,学习Kotlin究竟只是顺应趋势,还是真的具有比Java更好的特性呢?

Kotlin VS Java

1.Kotlin大大简化了代码

2/关于Null的处理

在Android top crashes 的排名上,第一 NPE(NullPointerException),第二OOM(特别对于低端机而言)

Java关于Null的处理方式

1
2
if(nullable!=null)
nullable.doStuff()

Kotlin

1
nullable?.doStuff()

在kotlin中,调用一个可为空的值的属性,是不安全的,并且编译器会报告一个错误

1
2
3
var b:String?="abc";

val l = b.length // wrong:变量b可能为空

那么我们如何来处理这种情况呢?

有以下几种方式可以做到

在条件中检查null

首先,你可以显示地检查 b 是否为null,并分别处理两会中可能

1
val l = if(b!=null)b.length else -1

编译器会跟踪所执行检查的信息,并允许你在 if 内部调用 length,同时,也支持更复杂的条件:

安全的调用

你的第二个选择是安全调用操作符,写作 ?. :

1
2
3
4
val a = "kotlin"
val b:String?=null
println(b?.length)
println(a?.length) // 无需安全调用

从上面其实可以看出,安全调用是一个简化的过程,把大量Java复杂的判断简化为一个操作符。并且,其前提是b是 nullabvle,可为空的引用,只有他为可空的,编译器才会对他有一系列的限制,如果为非空的,那么便宜器默认对他的操作都是安全的,但是这时候如果将它赋值为null,则会出现运行时错误。

Elvis操作符

当我们有一个可空的引用 r 时,我们可以说 如果 r 非空,我使用它,否则,使用某个非空的值 ‘x’ ,写作 ?:

例如

val l = b?.length?:-1

!! 操作符

第三种选择,是为NPE爱好者准备的,非空断言运算符(“!!”),将任何值转换为非空类型,若该值为空则抛出异常

安全的类型转换