困扰Kotlin的空安全

我是Kotlin的新手,在Kotlin读了不止一次的关于Null安全的知识 ,但是我很困惑,不太清楚。 任何人都可以帮助我回答以下问题:

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

  2. 运营商名称是否正确:

?. :安全的呼叫运营商

?: :猫王操作员

!! :确定运营商

  1. ?:运算符和?.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"因为xnull

最后一个没有真正的名字。 它通常被称为双重感叹号双重感叹号 。 它所做的是在值为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)}