对Kotlin的Null Safety感到困惑

An *_*yen 3 kotlin kotlin-null-safety

我是Kotlin的新手并且已经多次读过Kotlin的Null Safety,但我真的很困惑,并且不清楚.谁能帮我回答下面的问题:

  1. 什么!字符fun getString(key: String!)意味着什么?

  2. 以下运算符的名称是否正确:

?.:安全呼叫运营商

?::猫王运营商

!!:当然是运营商

  1. ?:运营商和?.let?之间有什么区别?我什么时候应该使用每一个?

Alf*_*Moh 6

第一个是单一exclamation mark (!)的称为平台类型.它的作用是,Kotlin不知道这个价值将如何发展.无论是null还是null,因此它由您决定.

第二个(?.)是安全呼叫运营商.它允许您将方法调用和空检查组合到单个操作中.

val x:String?
x="foo"
println(x?.toUpperCase())
Run Code Online (Sandbox Code Playgroud)

第三个(?:)是Elvis运算符Null-Coalescing运算符.它在使用时提供默认的预定义值而不是null.

fun main(args: Array<String>) {
    val x:String?;
    x=null;
    println(x?:"book".toUpperCase())
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,打印的值将是"BOOK"因为xIS null.

最后一个没有真正的名字.它通常被称为Double-bangDouble感叹号.它的作用是它抛出一个null pointer exceptionnull.

val x:String?;
x=null;
println(x!!.toUpperCase())
Run Code Online (Sandbox Code Playgroud)

这将抛出空指针异常.

?.let---> let函数

let函数将调用它的对象转换为通常使用lambda表达式表示的函数的参数.当与安全调用operator(?.)一起使用时,let函数可以方便地将可空对象转换为非可空类型的对象.

假设我们有这个功能.

fun ConvertToUpper (word: String) {word.toUpperCase()}
Run Code Online (Sandbox Code Playgroud)

ConvertToUpper的参数不为null,因此我们不能将null参数传递给它.

val newWord: String? = "foo"
ConvertToUpper(newWord)
Run Code Online (Sandbox Code Playgroud)

上面的代码不会编译,因为newWord可以为null,我们的ConvertToUpper函数不接受 null参数.

我们可以使用if表达式明确地解决这个问题.

if(newWord != null) ConvertToUpper(newWord)
Run Code Online (Sandbox Code Playgroud)

let函数通过调用函数简化了这一点,只是传递给它的值不为null.

newWord?.let {ConvertToUpper(it)}
Run Code Online (Sandbox Code Playgroud)