Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 你在科特林做什么?(猫王接线员)_Kotlin - Fatal编程技术网

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