我是 Kotlin 的新手,并且已经阅读过不止一次关于Kotlin 中的Null Safety的内容,但我真的很困惑,也不清楚。谁能帮我回答以下问题:
!
中的字符是什么fun getString(key: String!)
意思?以下操作员的名称是否正确:
?.
: 安全电话接线员
?:
: 猫王算子
!!
: 肯定的运营商
?:
operator 和 和有什么区别?.let
?我应该什么时候使用每一个?
我是 Kotlin 的新手,并且已经阅读过不止一次关于Kotlin 中的Null Safety的内容,但我真的很困惑,也不清楚。谁能帮我回答以下问题:
!
中的字符是什么fun getString(key: String!)
意思?
以下操作员的名称是否正确:
?.
: 安全电话接线员
?:
: 猫王算子
!!
: 肯定的运营商
?:
operator 和 和有什么区别?.let
?我应该什么时候使用每一个?第一个是单一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"
因为x
is null
。
最后一个真的没有名字。它通常被称为Double-bang或Double 感叹号。它的作用是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)}