我无法弄清楚?:
例如这种情况
val list = mutableList ?: mutableListOf()
Run Code Online (Sandbox Code Playgroud)
为什么可以修改它
val list = if (mutableList != null) mutableList else mutableListOf()
Run Code Online (Sandbox Code Playgroud)
s1m*_*nw1 84
该Elvis操作符是很多编程语言,如科特林而且也支持Groovy或C#的一部分.我发现维基百科的定义非常准确:
在某些计算机编程语言中,Elvis运算符
null
是一个二元运算符,如果该操作数是null
,则返回其第一个操作数,否则计算并返回其第二个操作数.这是一个三元条件运算符的变型,?:
在这些语言(和许多其他人)发现:Elvis操作符是三元运算符省略第二个操作数.
对于Kotlin来说尤其如此:
某些计算机编程语言对此运算符具有不同的语义.它必须导致对象引用,而不是第一个操作数必须导致布尔值.如果结果对象引用不是
true
,则返回它.否则? :
返回第二个操作数(可能是)的值.
一个例子:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
Run Code Online (Sandbox Code Playgroud)
Ker*_*ker 60
的Elvis操作符由问号后面跟着冒号表示:?:
并且它可以与这个语法中使用:
first operand ?: second operand
Run Code Online (Sandbox Code Playgroud)
它使您能够编写构造代码,并且可以这样工作:
如果first operand
不为null,则返回.如果为null,则second operand
返回.这可用于保证表达式不会返回空值,因为如果提供的值为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"
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果计算的值getPotentialNull
不为null,则将返回retrieveString
; 如果为null,则"Secondary Not-Null String"
返回第二个表达式.
另请注意,仅当左侧为空时才评估右侧表达式.
在Kotlin中,您可以使用任何表达式second operand
,例如throw Exception
表达式
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
Run Code Online (Sandbox Code Playgroud)
Elvis Operator这个名字来自美国着名歌手埃尔维斯普雷斯利.他的发型类似于问号
资料来源:Wojda,I.Moskala,M.与Kotlin的Android开发.2017.Packt Publishing
zsm*_*b13 32
这被称为猫王操作员,它确实......你在问题中描述的正是如此.如果它的左侧是一个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
Run Code Online (Sandbox Code Playgroud)
Kotlin 中的 elvis 运算符用于空安全。
x = a ?: b
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,x
将被赋值a
if a is notnull
和b
if a
is null
。
不使用 elvis 运算符的等效 kotlin 代码如下:
x = if(a == null) b else a
Run Code Online (Sandbox Code Playgroud)
我们来看看这个定义:
当我们有一个可以为空的引用r时,我们可以说"如果r不为null,则使用它,否则使用一些非空值x":
该?:
(猫王)运营商避免了冗长,使你的代码确实简洁.
例如,许多集合扩展函数null
作为后备返回.
listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")
Run Code Online (Sandbox Code Playgroud)
?:
即使您有多层回退,也可以让您以一种方式处理后备案例.如果是这样,您可以简单地链接乘以Elvis运算符,如下所示:
val l = listOf(1, 2, 3)
val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
Run Code Online (Sandbox Code Playgroud)
如果你用if if表示相同的话,那将是更多的代码,更难以阅读.
小智 5
简单地说,你有两只手。你想知道,你的左手现在工作了吗?如果左手不工作,return
empty
否则busy
Java 示例:
private int a;
if(a != null){
println("a is not null, Value is: "+a)
}
else{
println("a is null")
}
Run Code Online (Sandbox Code Playgroud)
Kotlin 示例:
val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"
Run Code Online (Sandbox Code Playgroud)
小智 5
考虑下面的例子,
var myStr:String? = null
//trying to find out length of myStr, but it could be null, so a null check can be put as,
val len = if (myStr != null){
myStr.length
}
else{
-1
}
Run Code Online (Sandbox Code Playgroud)
使用elvis运算符,可以将上面的代码写成一行
val len = myStr?.length ?: -1 // will return -1 if myStr is null else will return length
Run Code Online (Sandbox Code Playgroud)
除了已经陈述的内容之外,还有一种对我来说并不明显的好模式,但这是常见的,例如,您正在编写一个很长的函数,但如果某些内容为空,则没有意义继续,您唯一要做的就是能做的就是从函数中返回。通常你会写
something = expression
if (something == null) {
return
}
Run Code Online (Sandbox Code Playgroud)
有了 elvis,它变得更短、更优雅:
something = expression ?: return
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38487 次 |
最近记录: |