对 Kotlin 中的空安全感到困惑
Confused about Null Safety in Kotlin
我是 Kotlin 的新手,并且在 Kotlin 中阅读过不止一次有关 Null Safety 的内容,但我真的很困惑,没有理解清楚。谁能帮我回答下面的问题:
fun getString(key: String!)
中的!
字符是什么意思?
以下运算符名称是否正确:
?.
: 安全调用运算符
?:
: 猫王运算符
!!
: 确定运算符
?:
运算符和?.let
有什么区别?我应该什么时候使用它们?
第一个是单一的 exclamation mark (!)
称为 平台类型 。它所做的是,Kotlin 不知道该值将如何产生。是否为null 由您决定。
第二个 (?.
) 是 安全呼叫操作员。它允许您将方法调用和空检查合并到一个操作中。
val x:String?
x="foo"
println(x?.toUpperCase())
第三个 (?:
) 是 Elvis 运算符 或 Null-Coalescing 运算符 。它在使用时提供默认的预定义值而不是空值。
fun main(args: Array<String>) {
val x:String?;
x=null;
println(x?:"book".toUpperCase())
}
在这种情况下,打印值将是 "BOOK"
,因为 x
是 null
。
最后一个真的没有名字。通常称为双感叹号或双感叹号。它的作用是在值为 null
.
时抛出 null pointer exception
val x:String?;
x=null;
println(x!!.toUpperCase())
这将抛出空指针异常。
?.let
---> 让函数
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)}
我是 Kotlin 的新手,并且在 Kotlin 中阅读过不止一次有关 Null Safety 的内容,但我真的很困惑,没有理解清楚。谁能帮我回答下面的问题:
fun getString(key: String!)
中的!
字符是什么意思?以下运算符名称是否正确:
?.
: 安全调用运算符
?:
: 猫王运算符
!!
: 确定运算符
?:
运算符和?.let
有什么区别?我应该什么时候使用它们?
第一个是单一的 exclamation mark (!)
称为 平台类型 。它所做的是,Kotlin 不知道该值将如何产生。是否为null 由您决定。
第二个 (?.
) 是 安全呼叫操作员。它允许您将方法调用和空检查合并到一个操作中。
val x:String?
x="foo"
println(x?.toUpperCase())
第三个 (?:
) 是 Elvis 运算符 或 Null-Coalescing 运算符 。它在使用时提供默认的预定义值而不是空值。
fun main(args: Array<String>) {
val x:String?;
x=null;
println(x?:"book".toUpperCase())
}
在这种情况下,打印值将是 "BOOK"
,因为 x
是 null
。
最后一个真的没有名字。通常称为双感叹号或双感叹号。它的作用是在值为 null
.
null pointer exception
val x:String?;
x=null;
println(x!!.toUpperCase())
这将抛出空指针异常。
?.let
---> 让函数
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)}