Kotlin学习之旅第五天
今天的主题是:高级语法
前言
高级语法
空安全
写过Java代码的人都知道,空指针异常是时刻都要注意的,特别是在Android里面,一个NullPointerException就会让App Crash,因此在Kotlin里面,为了消除来自代码空引用的危险,默认引用是不能为空的。关于空指针异常,这里还有个趣闻:《十亿美元的错误》
在Kotlin里面,如果允许某个变量为null,我们可以通过 “ ? ” 来表示:
var b: String? = "abc"
b = null // ok
var a: String = "abc"
a = null // 编译错误
如果变量是可以为空的,那么每次都需要显示检查是否为null:
val l = if(b != null) b.length - 1
或者,通过安全调用操作符 -> " ?. "
fun main(args: Array<String>) {
val a = "Kotlin"
val b: String? = null
println(b?.length) // 如果b为null,则返回null
println(a?.length)
}
!!操作符
这个操作符在kotlin里面经常都能看到,他的作用就是:非空断言操作符。例如: a!! ,如果a为null,那么就会抛出异常,如果不为null,则返回a的值
因此,如果你不希望NPE没有被捕获而导致appcrash,也不希望字符串为null但是没有处理,那么你就需要使用!!操作符,在变量为null的时候会抛出异常,我们就能在控制台看到了。
异常
在Kotlin中,我们使用throw - Exception 来抛出异常:
throw Exception("this is an exception")
使用try来捕获异常:
try {
} catch (e: Exception){
} finally {
}
这个语法结构和Java里面是很类似的
反射
类引用
在反射中我们用的比较多的就是**类引用
**
val c = MyClass::class
该引用是 KClass 类型的值。
请注意,Kotlin 类引用与 Java 类引用不同。要获得 Java 类引用, 请在 KClass
实例上使用 .java
属性。
函数引用
通常我们会直接调用函数,通过 xxx() 来调用,但是我们也可以把函数传给另外一个函数当参数,使用的也是 ::
操作符
fun isOdd(x: Int) = x % 2 != 0
fun main(args: Array<String>) {
val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd))
}
在这个例子里面,我们首先定义了一个函数isOdd() 判断参数x是否为奇数,在main函数里,我们把这个方法作为参数传到了filter()方法里,这里其实是把函数当成 函数类型的值
,这个和Lambda表达式有点类似,都是把函数作为参数。
属性引用
同样,我们也是使用::
来引用属性
val x = 1
fun main(args: Array<String>) {
println(::x.get())
println(::x.name)
}
在这里,表达式 ::x
的意思是:
求值为 KProperty<Int>
类型的属性对象,它允许我们使用 get()
读取它的值,或者使用 name
属性来获取属性名。更多信息请参见关于 KProperty
类的文档。
总结
除了上面说的这几个语法,其实官方文档还有别的,例如:注解,类型别名,类型安全的构造器等等,我觉得这些语法用的都比较少,在看到或者需要用到的时候再去了解也可以,所以这里就没讲。
其实Kotlin的语法和Java还是很相像的,只是有一些技巧或者特性,需要在实践中掌握,从而提高开发效率。因此明天开始我们就会进入:Kotlin Idioms 环节,介绍一些好用的开发技巧~
Day 5 - Learn Kotlin Trip, Completed.