TL; DR: Si la référence d'objet résultant [premier opérande] n'est pas null, elle est renvoyée. Sinon, la valeur du deuxième opérande (qui peut être null) est renvoyée
L' opérateur Elvis fait partie de nombreux langages de programmation, par exemple Kotlin mais aussi Groovy ou C #. Je trouve la définition de Wikipedia assez précise:
Dans certains langages de programmation informatique, l' opérateur Elvis?: est un opérateur binaire qui renvoie son premier opérande si cet opérande est true, et sinon évalue et retourne son deuxième opérande. Il est une variante de l'opérateur conditionnel ternaire , ? :, trouvé dans ces langues (et bien d' autres): l'opérateur Elvis est l' opérateur ternaire avec son second opérande omis .
Ce qui suit est particulièrement vrai pour Kotlin:
Certains langages de programmation informatique ont une sémantique différente pour cet opérateur. Au lieu que le premier opérande ait pour résultat un booléen, il doit résulter en une référence d'objet . Si la référence d'objet résultante ne l'est pas null, elle est renvoyée. Sinon, la valeur du deuxième opérande (qui peut être null) est renvoyée.
Un exemple:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
C'est vraiment cool. Je n'ai jamais pensé elvis operatorpouvoir être réduit à autre chose. agréable! Et belle explication, merci!
sud007
88
L' opérateur Elvis est représenté par un point d'interrogation suivi de deux points: ?:et il peut être utilisé avec cette syntaxe:
first operand ?: second operand
Il vous permet d'écrire un code consise, et fonctionne comme tel:
S'il first operandn'est pas nul , il sera renvoyé. S'il est nul , le second operandsera retourné. Cela peut être utilisé pour garantir qu'une expression ne retournera pas une valeur nulle, car vous fournirez une valeur non nullable si la valeur fournie est nulle.
Par exemple (à Kotlin):
funretrieveString(): String { //Notice that this type isn't nullableval nullableVariable: String? = getPotentialNull() //This variable may be nullreturn nullableVariable ?: "Secondary Not-Null String"
}
Dans ce cas, si la valeur calculée de getPotentialNulln'est pas nulle, elle sera renvoyée par retrieveString; S'il est nul, la deuxième expression "Secondary Not-Null String"sera renvoyée à la place.
Notez également que l'expression du côté droit est évaluée uniquement si le côté gauche est nul .
Dans Kotlin, vous pouvez utiliser n'importe quelle expression second operandtelle qu'une throw Exceptionexpression
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
Le nom Elvis Operator vient du célèbre chanteur américain Elvis Presley . Sa coiffure ressemble à un point d'interrogation
Source: Wojda, I. Moskala, M. Développement Android avec Kotlin. 2017. Packt Publishing
Après un certain temps, je ne comprends pas pourquoi il s'appelle Elvis Operator. Votre illustration m'a fait savoir pourquoi il s'appelle Elvis Operator. :)
Yohanes AI
est-ce que l'histoire d'Elvis est vraiment vraie? haha
Hillcow
@Kerooker Il ne sourit pas,?: | sera mieux IMO.
ahmed galal
38
C'est ce qu'on appelle l' opérateur Elvis et c'est le cas ... Exactement ce que vous avez décrit dans votre question. Si son côté gauche est une nullvaleur, il renvoie le côté droit à la place, une sorte de repli. Sinon, il renvoie simplement la valeur sur le côté gauche.
a ?: best juste un raccourci pour if (a != null) a else b.
Quelques autres exemples avec des types:
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
?:vous donne un moyen de gérer le cas de secours de manière élégante même si vous avez plusieurs couches de secours. Si tel est le cas, vous pouvez simplement chaîner des opérateurs Elvis multipliés, comme ici:
val l = listOf(1, 2, 3)
val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
Si vous exprimiez la même chose avec if else, ce serait beaucoup plus de code qui est plus difficile à lire.
Nous pouvons simplement dire que vous avez deux mains. Vous voulez savoir, est-ce que votre main gauche travaille en ce moment ?. Si la main gauche ne fonctionne pas, returnemptysinonbusy
Exemple pour Java:
private int a;
if(a != null){
println("a is not null, Value is: "+a)
}
else{
println("a is null")
}
Exemple pour Kotlin:
val a : Int = 5val l : Int = if (a != null) a.length else"a is null"
Par conséquent, si vous voulez Xtoujours être non-null, assurez-vous que Bc'est toujours un non-nullou qui Bévalue toujours non-nulls'il s'agit d'une fonction ou d'une expression.
Réponses:
TL; DR: Si la référence d'objet résultant [premier opérande] n'est pas
null
, elle est renvoyée. Sinon, la valeur du deuxième opérande (qui peut êtrenull
) est renvoyéeL' opérateur Elvis fait partie de nombreux langages de programmation, par exemple Kotlin mais aussi Groovy ou C #. Je trouve la définition de Wikipedia assez précise:
Ce qui suit est particulièrement vrai pour Kotlin:
Un exemple:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
la source
elvis operator
pouvoir être réduit à autre chose. agréable! Et belle explication, merci!L' opérateur Elvis est représenté par un point d'interrogation suivi de deux points:
?:
et il peut être utilisé avec cette syntaxe:Il vous permet d'écrire un code consise, et fonctionne comme tel:
S'il
first operand
n'est pas nul , il sera renvoyé. S'il est nul , lesecond operand
sera retourné. Cela peut être utilisé pour garantir qu'une expression ne retournera pas une valeur nulle, car vous fournirez une valeur non nullable si la valeur fournie est nulle.Par exemple (à 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" }
Dans ce cas, si la valeur calculée de
getPotentialNull
n'est pas nulle, elle sera renvoyée parretrieveString
; S'il est nul, la deuxième expression"Secondary Not-Null String"
sera renvoyée à la place.Notez également que l'expression du côté droit est évaluée uniquement si le côté gauche est nul .
Dans Kotlin, vous pouvez utiliser n'importe quelle expression
second operand
telle qu'unethrow Exception
expressionreturn nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
Le nom Elvis Operator vient du célèbre chanteur américain Elvis Presley . Sa coiffure ressemble à un point d'interrogation
Source: Wojda, I. Moskala, M. Développement Android avec Kotlin. 2017. Packt Publishing
la source
C'est ce qu'on appelle l' opérateur Elvis et c'est le cas ... Exactement ce que vous avez décrit dans votre question. Si son côté gauche est une
null
valeur, il renvoie le côté droit à la place, une sorte de repli. Sinon, il renvoie simplement la valeur sur le côté gauche.a ?: b
est juste un raccourci pourif (a != null) a else b
.Quelques autres exemples avec des types:
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
la source
a != null ? a : b
Jetons un coup d'œil à la définition :
L'
?:
opérateur (Elvis) évite la verbosité et rend votre code vraiment concis.Par exemple, de nombreuses fonctions d'extension de collection sont
null
renvoyées comme solution de secours.listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")
?:
vous donne un moyen de gérer le cas de secours de manière élégante même si vous avez plusieurs couches de secours. Si tel est le cas, vous pouvez simplement chaîner des opérateurs Elvis multipliés, comme ici:val l = listOf(1, 2, 3) val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
Si vous exprimiez la même chose avec if else, ce serait beaucoup plus de code qui est plus difficile à lire.
la source
Nous pouvons simplement dire que vous avez deux mains. Vous voulez savoir, est-ce que votre main gauche travaille en ce moment ?. Si la main gauche ne fonctionne pas,
return
empty
sinonbusy
Exemple pour Java:
private int a; if(a != null){ println("a is not null, Value is: "+a) } else{ println("a is null") }
Exemple pour Kotlin:
val a : Int = 5 val l : Int = if (a != null) a.length else "a is null"
la source
Fondamentalement, si le côté gauche d'Elvis retourne null pour une raison quelconque, renvoie le côté droit à la place.
c'est à dire
val number: Int? = null println(number ?: "Number is null")
Donc, si nombre n'est PAS nul , il affichera le nombre, sinon affichera "Le nombre est nul".
la source
L'opérateur elvis de Kotlin est utilisé pour la sécurité nulle.
Dans le code ci-dessus,
x
on attribuera la valeur dea
if a n'est pasnull
etb
sia
estnull
.Le code kotlin équivalent sans utiliser l'opérateur elvis est ci-dessous:
x = if(a == null) b else a
la source
Un petit ajout cependant est-ce
X
sera toujoursnull
si les deuxA
etB
évaluer ànull
Par conséquent, si vous voulez
X
toujours êtrenon-null
, assurez-vous queB
c'est toujours unnon-null
ou quiB
évalue toujoursnon-null
s'il s'agit d'une fonction ou d'une expression.la source