什么?在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 Exception
expression式
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
猫王操作员的名字来自美国着名歌手埃尔维斯·普雷斯利 ( Elvis Presley) 。 他的发型酷似一个问号
让我们来看看这个定义 :
当我们有一个可为空的引用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相同的话,那么将会有更多的代码难以阅读。