4

我是 Kotlin 的新手,并且已经阅读过不止一次关于Kotlin 中的Null Safety的内容,但我真的很困惑,也不清楚。谁能帮我回答以下问题:

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

  2. 以下操作员的名称是否正确:

?.: 安全电话接线员

?:: 猫王算子

!!: 肯定的运营商

  1. ?:operator 和 和有什么区别?.let?我应该什么时候使用每一个?
4

1 回答 1

7

第一个是单一exclamation mark (!)的称为平台类型。它所做的是,Kotlin 不知道该值将如何产生。是否为空,因此由您决定。

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

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

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

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

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

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

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

这将引发空指针异常。

?.let---> let 函数

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

假设我们有这个功能。

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

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

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

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

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

if(newWord != null) ConvertToUpper(newWord)

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

newWord?.let {ConvertToUpper(it)}
于 2017-07-29T16:02:05.790 回答