对Kotlin的Null Safety感到困惑

时间:2017-07-29 15:18:00

标签: kotlin kotlin-null-safety

我是Kotlin的新手并且在Kotlin上读了不止一次关于Null Safety但是我真的很困惑并且不清楚。任何人都可以帮我回答下面的问题:

  1. !中的fun getString(key: String!)字符是什么意思?

  2. 以下运营商名称是否正确:

  3. ?.:安全通话运营商

    ?::猫王运营商

    !!:当然是操作员

    1. ?:运营商与?.let之间的差异是什么?我什么时候应该使用每一个?

1 个答案:

答案 0 :(得分:6)

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

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

val x:String?
x="foo"
println(x?.toUpperCase())

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

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

在这种情况下,由于"BOOK"x,因此打印的值为null

最后一个没有名字。它通常被称为 Double-bang Double感叹号。它的作用是当值为null pointer exception时抛出null

val x:String?;
x=null;
println(x!!.toUpperCase())

这将抛出空指针异常。

?.let ---&gt; 让功能

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

我们说我们有这个功能。

fun ConvertToUpper (word: String) {word.toUpperCase()}

ConvertToUpper的参数不为null,因此我们无法将null参数传递给它。

val newWord: String? = "foo"
ConvertToUpper(newWord)

上面的代码无法编译,因为newWord可以为null,而ConvertToUpper函数不接受null参数。

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

if(newWord != null) ConvertToUpper(newWord)

let函数通过调用函数来简化这一点,只是传递给它的值不是空的。

newWord?.let {ConvertToUpper(it)}