在 Kotlin 中,?. 和 ?: 分别代表安全调用运算符和 Elvis 运算符,它们用于处理可为 null 的情况,以简化代码并避免空指针异常(NullPointerException)。
安全调用运算符 ?.:
val files = File("Test").listFiles()
println(files?.size) // size is printed if files is not null
在这个例子中,files?.size 使用了安全调用运算符。如果 files 不为 null,则会打印出文件数量;如果 files 为 null,则不会抛出空指针异常,而是输出 null。
Elvis 运算符 ?::
val files = File("Test").listFiles()
// For simple fallback values:
println(files?.size ?: "empty") // if files is null, this prints "empty"
在这个例子中,files?.size ?: "empty" 使用了 Elvis 运算符。如果 files 不为 null,则输出文件数量;如果 files 为 null,则输出 "empty"。Elvis 运算符提供了一种简洁的方式,当表达式为 null 时,可以提供一个默认值。
Elvis 运算符和 run 的结合使用:
val files = File("Test").listFiles()
// To calculate a more complicated fallback value in a code block, use `run`
val filesSize = files?.size ?: run {
val someSize = getSomeSize()
someSize * 2
}
println(filesSize)
在这个例子中,如果 files 不为 null,则 files?.size 为文件数量;如果 files 为 null,则通过 run 代码块计算出一个更复杂的回退值。这样,你可以在 run 代码块中执行一些逻辑以计算默认值。
总的来说,这些语法元素在 Kotlin 中用于处理空值情况,使代码更为简洁、清晰,同时增强了处理可能为空的对象的安全性。