我是Kotlin的新手并且在Kotlin上读了不止一次关于Null Safety但是我真的很困惑并且不清楚。任何人都可以帮我回答下面的问题:
!
中的fun getString(key: String!)
字符是什么意思?
以下运营商名称是否正确:
?.
:安全通话运营商
?:
:猫王运营商
!!
:当然是操作员
?:
运营商与?.let
之间的差异是什么?我什么时候应该使用每一个?答案 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)}