TL; DR: Si la referencia del objeto resultante [primer operando] no nulllo es, se devuelve. De lo contrario, nullse devuelve el valor del segundo operando (que puede ser )
El operador de Elvis es parte de muchos lenguajes de programación, por ejemplo, Kotlin pero también Groovy o C #. Encuentro la definición de Wikipedia bastante precisa:
En ciertos lenguajes de programación de computadoras, el operador de Elvis?: es un operador binario que devuelve su primer operando si ese operando es true, y de lo contrario evalúa y devuelve su segundo operando. Se trata de una variante del operador condicional ternario , ? :encontró en esos idiomas (y muchos otros): el operador Elvis es el operador ternario con su segundo operando omitido .
Lo siguiente es especialmente cierto para Kotlin:
Algunos lenguajes de programación de computadoras tienen una semántica diferente para este operador. En lugar de que el primer operando tenga que dar como resultado un booleano, debe dar como resultado una referencia de objeto . Si la referencia del objeto resultante no nulllo es, se devuelve. De lo contrario, nullse devuelve el valor del segundo operando (que puede ser ).
Un ejemplo:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
Esto es realmente genial. Nunca pensé que elvis operatorpudiera reducirse más a otra cosa. ¡bonito! Y bonita explicación, ¡gracias!
sud007
88
El operador de Elvis está representado por un signo de interrogación seguido de dos puntos: ?:y se puede usar con esta sintaxis:
first operand ?: second operand
Le permite escribir un código coherente y funciona como tal:
Si first operandno es nulo , se devolverá. Si es nulo , second operandse devolverá. Esto se puede usar para garantizar que una expresión no devuelva un valor nulo, ya que proporcionará un valor que no acepta valores NULL si el valor proporcionado es nulo.
Por ejemplo (en Kotlin):
funretrieveString(): String { //Notice that this type isn't nullableval nullableVariable: String? = getPotentialNull() //This variable may be nullreturn nullableVariable ?: "Secondary Not-Null String"
}
En este caso, si el valor calculado de getPotentialNullno es nulo, será devuelto por retrieveString; Si es nulo, "Secondary Not-Null String"se devolverá la segunda expresión .
También tenga en cuenta que la expresión del lado derecho se evalúa solo si el lado izquierdo es nulo .
En Kotlin, puede usar cualquier expresión como second operand, por ejemplo, una throw Exceptionexpresión
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
El nombre Elvis Operator proviene del famoso cantante estadounidense Elvis Presley . Su peinado se asemeja a un signo de interrogación.
Fuente: Wojda, I. Moskala, M. Desarrollo de Android con Kotlin. 2017. Packt Publishing
Después de un tiempo, no puedo entender por qué se llama Elvis Operator. Tu ilustración me hizo saber por qué se llama Elvis Operator. :)
Yohanes AI
¿Es realmente cierta la historia de Elvis? jaja
Hillcow
@Kerooker No está sonriendo,?: | será mejor en mi opinión.
Ahmed Galal
38
Esto se llama operador de Elvis y lo hace ... Exactamente lo que ha descrito en su pregunta. Si su lado izquierdo es un nullvalor, devuelve el lado derecho en su lugar, una especie de retroceso. De lo contrario, solo devuelve el valor en el lado izquierdo.
a ?: bes solo una abreviatura de if (a != null) a else b.
Algunos ejemplos más con tipos:
val x: String? = "foo"val y: String = x ?: "bar"// "foo", because x was non-null val a: String? = nullval b: String = a ?: "bar"// "bar", because a was null
?:le brinda una forma de manejar el caso de respaldo de manera elegante incluso si tiene varias capas de respaldo. Si es así, simplemente puede encadenar operadores de Elvis multiplicados, como aquí:
val l = listOf(1, 2, 3)
val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
Si expresara lo mismo con si de lo contrario, sería mucho más código que es más difícil de leer.
Simplemente podemos decir que tienes dos manos. Quieres saber si tu mano izquierda está funcionando en este momento ?. Si la mano izquierda no funciona, de lo returnemptycontrariobusy
Ejemplo para Java:
private int a;
if(a != null){
println("a is not null, Value is: "+a)
}
else{
println("a is null")
}
Ejemplo de Kotlin:
val a : Int = 5val l : Int = if (a != null) a.length else"a is null"
Respuestas:
TL; DR: Si la referencia del objeto resultante [primer operando] no
null
lo es, se devuelve. De lo contrario,null
se devuelve el valor del segundo operando (que puede ser )El operador de Elvis es parte de muchos lenguajes de programación, por ejemplo, Kotlin pero también Groovy o C #. Encuentro la definición de Wikipedia bastante precisa:
Lo siguiente es especialmente cierto para Kotlin:
Un ejemplo:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
fuente
elvis operator
pudiera reducirse más a otra cosa. ¡bonito! Y bonita explicación, ¡gracias!El operador de Elvis está representado por un signo de interrogación seguido de dos puntos:
?:
y se puede usar con esta sintaxis:Le permite escribir un código coherente y funciona como tal:
Si
first operand
no es nulo , se devolverá. Si es nulo ,second operand
se devolverá. Esto se puede usar para garantizar que una expresión no devuelva un valor nulo, ya que proporcionará un valor que no acepta valores NULL si el valor proporcionado es nulo.Por ejemplo (en 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" }
En este caso, si el valor calculado de
getPotentialNull
no es nulo, será devuelto porretrieveString
; Si es nulo,"Secondary Not-Null String"
se devolverá la segunda expresión .También tenga en cuenta que la expresión del lado derecho se evalúa solo si el lado izquierdo es nulo .
En Kotlin, puede usar cualquier expresión como
second operand
, por ejemplo, unathrow Exception
expresiónreturn nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
El nombre Elvis Operator proviene del famoso cantante estadounidense Elvis Presley . Su peinado se asemeja a un signo de interrogación.
Fuente: Wojda, I. Moskala, M. Desarrollo de Android con Kotlin. 2017. Packt Publishing
fuente
Esto se llama operador de Elvis y lo hace ... Exactamente lo que ha descrito en su pregunta. Si su lado izquierdo es un
null
valor, devuelve el lado derecho en su lugar, una especie de retroceso. De lo contrario, solo devuelve el valor en el lado izquierdo.a ?: b
es solo una abreviatura deif (a != null) a else b
.Algunos ejemplos más con tipos:
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
fuente
a != null ? a : b
Echemos un vistazo a la definición :
los
?:
operador (Elvis) evita la verbosidad y hace que su código sea realmente conciso.Por ejemplo, muchas funciones de extensión de colección regresan
null
como reserva.listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")
?:
le brinda una forma de manejar el caso de respaldo de manera elegante incluso si tiene varias capas de respaldo. Si es así, simplemente puede encadenar operadores de Elvis multiplicados, como aquí:val l = listOf(1, 2, 3) val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
Si expresara lo mismo con si de lo contrario, sería mucho más código que es más difícil de leer.
fuente
Simplemente podemos decir que tienes dos manos. Quieres saber si tu mano izquierda está funcionando en este momento ?. Si la mano izquierda no funciona, de lo
return
empty
contrariobusy
Ejemplo para Java:
private int a; if(a != null){ println("a is not null, Value is: "+a) } else{ println("a is null") }
Ejemplo de Kotlin:
val a : Int = 5 val l : Int = if (a != null) a.length else "a is null"
fuente
Básicamente, si el lado izquierdo de Elvis devuelve nulo por alguna razón, devuelve el lado derecho en su lugar.
es decir
val number: Int? = null println(number ?: "Number is null")
Entonces, si el número NO es nulo , imprimirá el número; de lo contrario , imprimirá "El número es nulo".
fuente
El operador de elvis en Kotlin se utiliza para una seguridad nula.
En el código anterior,
x
se le asignará el valor dea
si a no esnull
yb
sia
esnull
.El código de kotlin equivalente sin usar el operador de elvis está a continuación:
x = if(a == null) b else a
fuente
Aunque una pequeña adición es esta
X
seguirá siendonull
si ambosA
yB
evalúannull
Por lo tanto, si quiere
X
ser siemprenon-null
, asegúrese deB
que siempre sea unnon-null
o queB
siempre evalúenon-null
si es una función o expresión.fuente