困扰Kotlin的空安全
我是Kotlin的新手,在Kotlin读了不止一次的关于Null安全的知识 ,但是我很困惑,不太清楚。 任何人都可以帮助我回答以下问题:
-
什么
!
fun getString(key: String!)
字符fun getString(key: String!)
是什么意思? -
运营商名称是否正确:
?.
:安全的呼叫运营商
?:
:猫王操作员
!!
:确定运营商
-
?:
运算符和?.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
是null
。
最后一个没有真正的名字。 它通常被称为双重感叹号或双重感叹号 。 它所做的是在值为null
时抛出null pointer exception
。
val x:String?; x=null; println(x!!.toUpperCase())
这将抛出一个空指针异常。
?.let
– > 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函数只是通过调用函数来简化这一点,传递给它的值不为null。
newWord?.let {ConvertToUpper(it)}