Kotlin 你在科特林做什么?(猫王接线员)
例如,我不知道Kotlin 你在科特林做什么?(猫王接线员),kotlin,Kotlin,例如,我不知道?:在这种情况下做了什么 val list = mutableList ?: mutableListOf() 为什么它可以被修改成这样 val list = if (mutableList != null) mutableList else mutableListOf() 这就是所谓的,它确实。。。正是你在问题中所描述的。如果它的左侧是一个null值,那么它将返回右侧,有点像是一个回退。否则它只返回左侧的值 a?:b只是if(a!=null)a else b的简写 更多关于类
?:
在这种情况下做了什么
val list = mutableList ?: mutableListOf()
为什么它可以被修改成这样
val list = if (mutableList != null) mutableList else mutableListOf()
这就是所谓的,它确实。。。正是你在问题中所描述的。如果它的左侧是一个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
让我们看一下:
当我们有一个可为null的引用r时,我们可以说“如果r不是null,那么使用
否则,请使用一些非空值x”:
?:
(Elvis)操作符避免了冗长,并使代码非常简洁
例如,许多集合扩展函数返回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")
如果你用If-else表达同样的意思,那么代码就会多得多,更难阅读。TL;DR:如果结果对象引用[第一个操作数]不是null
,则返回它。否则,将返回第二个操作数的值(可能是null
)。此外,如果返回null,则运算符可以引发异常
Elvis操作符是许多编程语言的一部分,例如Kotlin,但也是Groovy或C#。 我觉得这个定义相当准确: 在某些计算机编程语言中,Elvis运算符
?:
是一个二进制运算符,如果第一个操作数为true
,则返回该操作数,否则计算并返回其第二个操作数。它是三元条件运算符的变体,,?:代码>,在这些语言(以及许多其他语言)中都可以找到:Elvis运算符是三元运算符,省略了第二个操作数
以下情况对Kotlin尤其适用:
val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"
某些计算机编程语言对此运算符具有不同的语义。第一个操作数不必产生布尔值,而必须产生对象引用。如果生成的对象引用不是null
,则返回它。否则,将返回第二个操作数的值(可能是null
)。如果第二个操作数为null,则运算符也可以引发异常
例如:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
x ?: throw SomeException() // yields `x` if `x` is not null, throws SomeException otherwise
Elvis运算符由问号和冒号表示:?:
,可与以下语法一起使用:
first operand ?: second operand
它使您能够编写一个一致的代码,其工作原理如下:
如果第一个操作数
不是null,则将返回它。如果为空,则将返回第二个操作数
。这可以用来保证表达式不会返回null值,因为如果提供的值为null,则将提供不可为null的值
例如(在科特林):
在这种情况下,如果getPotentialNull
的计算值不为null,则它将由retrieveString
返回;如果为null,则将返回第二个表达式“Secondary Not null String”
还请注意,如果左侧为null,则仅对右侧表达式求值
在Kotlin中,可以使用任何表达式作为第二个操作数
,例如抛出异常
表达式
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
Elvis Operator这个名字来自著名的美国歌手Elvis Presley。他的发型像个问号
资料来源:Wojda,I.Moskala,M.Kotlin的Android开发。2017Packt Publishing简单地说,你有两只手。你想知道,你的左手现在在工作吗?。如果左手不工作,返回
空
否则忙
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"
基本上,如果Elvis的左侧由于某种原因返回null,则返回右侧
i、 e
所以,如果数字不为空,它将打印数字,否则将打印“数字为空” Kotlin中的elvis运算符用于空安全
x = a ?: b
在上述代码中,x
将被分配a
的值(如果a不是null
)和b
的值(如果a
是null
)
不使用elvis运算符的等效kotlin代码如下:
x = if(a == null) b else a
这是一个小小的补充
X = A ?: B
X
如果A
和B
计算为null
因此,如果希望X
始终为非空
,请确保B
始终为非空
,或者B
如果是函数或表达式,则其计算结果始终为非空。考虑以下示例
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
}
使用elvis运算符,上述代码可以写在一行中
val len = myStr?.length ?: -1 // will return -1 if myStr is null else will return length
如果不为空,则返回左侧,否则返回右侧。第一个表达式是第二个表达式的简短符号。如果你来自java,它更像是:a!=无效的a:b
val len = myStr?.length ?: -1 // will return -1 if myStr is null else will return length