什么?在Kotlin做什么?

我无法弄清楚什么?:例如在这种情况下

 val list = mutableList ?: mutableListOf() 

为什么可以修改它呢?

 val list = if (mutableList != null) mutableList else mutableListOf() 

除了其他好的答案:

Elvis操作符是许多编程语言的一部分,例如Kotlin,但也包括Groovy或C#。 我发现维基百科定义非常准确:

在某些计算机编程语言中, Elvis算子是一个二元运算符 ,如果该操作数为true ,则返回其第一个操作数,否则返回第二个操作数。 它是三元条件运算符变体? : ? : ,在这些语言(和许多其他语言)中发现:猫王操作符是三元操作符,省略了第二个操作符

Kotlin尤其如此:

一些计算机编程语言对这个操作符有不同的语义。 而不是第一个操作数必须导致一个布尔值,它必须导致一个对象引用 。 如果生成的对象引用不为null ,则返回。 否则,返回第二个操作数(可能为null )的值。

这就是所谓的猫王操作符 ,它确实是你在你的问题中描述的。 如果左侧是null值,则返回右侧,作为后备。 否则,它只是返回左侧的值。

a ?: b只是if (a != null) a else b简写。

更多types的例子:

 val x: String? = "foo" val y: String = x ?: "bar" // "foo", because x was non-null val a: String? = null val b: String = a ?: "bar" // "bar", because a was null 

Elvis操作符由一个问号跟一个冒号表示: ?:它可以用于这个语法:

 first operand ?: second operand 

它使您能够编写一个consise代码,并运行如下:

如果first operand 不是null ,那么它将被返回。 如果为空 ,则返回second operand 。 这可以用来保证expression式不会返回null值,因为如果提供的值为null,那么您将提供一个不可为空的值。


例如(在Kotlin):

 fun retrieveString(): String { //Notice that this type isn't nullable var nullableVariable: String? = getPotentialNull() //This variable may be null return nullableVariable ?: "Secondary Not-Null String" } 

在这种情况下,如果getPotentialNull的计算值不为null,则将由retrieveString返回; 如果为空,则返回第二个expression式"Secondary Not-Null String"

另外请注意, 只有在左侧为空的情况下 ,右侧expression式才会被计算。

在Kotlin中,可以使用任何expression式作为second operand ,例如throw Exceptionexpression式

 return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!") 

猫王操作员的名字来自美国着名歌手埃尔维斯·普雷斯利Elvis Presley) 。 他的发型酷似一个问号

猫王QuestionMark

让我们来看看这个定义 :

当我们有一个可为空的引用r时,我们可以说“如果r不是null,使用它,否则使用一些非空值x”:

?: (Elvis)操作符可以避免冗长,使代码真正简洁。

例如,很多集合扩展函数返回null作为后备。

 listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups") 

?:为您提供了一种方法,即使您有多个后备层,也可以轻松地处理备用案例。 如果是这样,你可以简单地连锁多个猫王运营商,就像这里:

 val l = listOf(1, 2, 3) val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups") 

如果你要expression相同的话,那么将会有更多的代码难以阅读。