Je ne peux pas comprendre ce que ?:
fait par exemple ce cas
val list = mutableList ?: mutableListOf()
et pourquoi peut-il être modifié en ceci
val list = if (mutableList != null) mutableList else mutableListOf()
Je ne peux pas comprendre ce que ?:
fait par exemple ce cas
val list = mutableList ?: mutableListOf()
et pourquoi peut-il être modifié en ceci
val list = if (mutableList != null) mutableList else mutableListOf()
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 ê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 esttrue
, 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 êtrenull
) est renvoyée.
Un exemple:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
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:
first operand ?: second operand
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 , le second 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 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 operand
telle qu'une throw Exception
expression
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
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 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? = null
val b: String = a ?: "bar" // "bar", because a was null
a != null ? a : b
Jetons un coup d'œil à la définition :
Lorsque nous avons une référence r nullable, nous pouvons dire "si r n'est pas nul, utilisez-le, sinon utilisez une valeur x non nulle":
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.
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"
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".
L'opérateur elvis de Kotlin est utilisé pour la sécurité nulle.
x = a ?: b
Dans le code ci-dessus, x
on attribuera la valeur de a
if a n'est pas null
et b
si a
est null
.
Le code kotlin équivalent sans utiliser l'opérateur elvis est ci-dessous:
x = if(a == null) b else a