Kotlin相较于java的一大优势就是可以减少空指针的出现,变量的type需要指定是否能为空,不带?的type不能为空
var a: String = "abc"
a = null // compilation error
var b: String? = "abc"
b = null // ok
不为空的变量可以调用方法,但是为空的变量使用前显式需要检查是否为空
val l = a.length //合法
val l = b.length // 不合法
检查是否为空
- option1
val l = if (b != null) b.length else -1
或者
if (b != null && b.length > 0) {
print("String of length ${b.length}")
} else {
print("Empty string")
}
- option2
safe call 操作符
b?.length
如果b不为空,返回 b.length,如果b为空,返回null
safe call可以和let一起使用,只对非空元素进行操作
val listWithNulls: List<String?> = listOf("A", null)
for (item in listWithNulls) {
item?.let { println(it) } // prints A and ignores null
}
Elvis 操作符
?:
如果符号左边的表达式不为空,则返回左边的表达式,否则返回右边的表达式
val l = b?.length ?: -1
如果b?.length
不为空,则返回它,如果为空,返回-1
return
和throw
可以放在elvis操作符的右边
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
// ...
}
!!操作符
b!!,如果b不为空,则返回b,如果b为空,则throw NullPointerException。
val l = b!!.length
使用filterNotNull
来过滤集合中空元素