我不知道?:
在这种情况下会做什么
val list = mutableList ?: mutableListOf()
以及为什么可以对此进行修改
val list = if (mutableList != null) mutableList else mutableListOf()
Answers:
TL; DR:如果结果对象引用[第一个操作数]不是null
,则返回它。否则,null
返回第二个操作数的值(可能是)
该Elvis操作符是很多编程语言,如科特林而且也支持Groovy或C#的一部分。我发现Wikipedia定义非常准确:
在某些计算机编程语言中,Elvis运算符
?:
是二进制运算符,如果该运算符为true
,则返回其第一个操作数,否则,求值并返回其第二个操作数。这是一个三元条件运算符的变型,? :
在这些语言(和许多其他人)发现:Elvis操作符是三元运算符省略第二个操作数。
对于Kotlin,以下情况尤其如此:
某些计算机编程语言对此运算符具有不同的语义。代替第一个操作数必须产生布尔值,它必须导致对象引用。如果生成的对象引用不是
null
,则返回它。否则,null
返回第二个操作数的值(可能是)。
一个例子:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
elvis operator
可以进一步简化为其他内容。真好!很好的解释,谢谢!
的Elvis操作符由问号后面跟着冒号表示:?:
并且它可以与这个语法中使用:
first operand ?: second operand
它使您能够编写简明的代码,其工作方式如下:
如果first operand
不为null,则将其返回。如果为null,则将second operand
返回。这可以用来确保表达式不会返回空值,因为如果提供的值为null,则将提供非空值。
例如(在Kotlin中):
fun retrieveString(): String { //Notice that this type isn't nullable
val nullableVariable: String? = getPotentialNull() //This variable may be null
return nullableVariable ?: "Secondary Not-Null String"
}
在这种情况下,如果的计算值getPotentialNull
不为null,它将由retrieveString
;返回。如果为null,"Secondary Not-Null String"
则将返回第二个表达式。
还要注意,仅当左侧为null时,才对右侧表达式求值。
在Kotlin中,您可以将任何表达式用作second operand
,例如throw Exception
表达式
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
猫王运营商这个名字来自著名的美国歌手埃尔维斯普雷斯利。他的发型像问号
资料来源:Wojda,I。Moskala,M。与Kotlin进行Android开发。2017. Packt出版
这叫做Elvis运算符,它确实...您在问题中所描述的正是。如果它的左手边是一个null
值,它将返回右边,作为后备。否则,它仅返回左侧的值。
a ?: b
是的简写if (a != null) a else b
。
有关类型的更多示例:
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
a != null ? a : b
让我们看一下定义:
当我们有一个可为空的引用r时,我们可以说“如果r不为null,则使用它,否则使用一些非null值x”:
该?:
(猫王)运营商避免了冗长,使你的代码确实简洁。
例如,许多集合扩展功能null
作为后备返回。
listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")
?:
即使您具有多个后备层,也可以为您提供出色地处理后备案的方法。如果是这样,您可以简单地链接乘法Elvis运算符,如下所示:
val l = listOf(1, 2, 3)
val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
如果您要与其他情况表达相同的话,那么将会有更多的代码难以阅读。
简单地说,您有两只手。您想知道,您的左手现在在工作吗?如果左手不起作用,return
empty
否则busy
Java示例:
private int a;
if(a != null){
println("a is not null, Value is: "+a)
}
else{
println("a is null")
}
Kotlin示例:
val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"