Kotlin的 ‘?.’ 和 ‘?:’

373 阅读1分钟

在 Kotlin 中,?.?: 分别代表安全调用运算符和 Elvis 运算符,它们用于处理可为 null 的情况,以简化代码并避免空指针异常(NullPointerException)。

安全调用运算符 ?.

val files = File("Test").listFiles()

println(files?.size) // size is printed if files is not null

在这个例子中,files?.size 使用了安全调用运算符。如果 files 不为 null,则会打印出文件数量;如果 filesnull,则不会抛出空指针异常,而是输出 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,则输出文件数量;如果 filesnull,则输出 "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 为文件数量;如果 filesnull,则通过 run 代码块计算出一个更复杂的回退值。这样,你可以在 run 代码块中执行一些逻辑以计算默认值。

总的来说,这些语法元素在 Kotlin 中用于处理空值情况,使代码更为简洁、清晰,同时增强了处理可能为空的对象的安全性。