Si j'ai un Boolean b
Nullable, je peux faire la comparaison suivante en Java:
Boolean b = ...;
if (b != null && b) {
/* Do something */
} else {
/* Do something else */
}
En Kotlin, je peux obtenir la même chose en utilisant l'opérateur !!
:
val b: Boolean? = ...
if (b != null && b!!) {
/* Do something */
} else {
/* Do something else */
}
Cependant, l'utilisation de !!
Me semble un peu louche, contournant le système de sécurité nul.
Y at-il une approche plus élégante pour cela?
Edit Il semble que j'ai un peu trop simplifié. Pour les variables locales, comme Banthar , cela fonctionne. Cependant, ma valeur booléenne b
est en réalité une "propriété avec un champ de support" (je ne suis pas vraiment au courant de ce que cela impose). Voici le résultat:
Vous pouvez comparer un booléen nullable avec true
, false
ou null
à l'aide de l'opérateur d'égalité:
var b: Boolean? = null
if (b == true) {
// b was not null and equal true
}
Si vous voulez vérifier proprement si un Boolean?
est true
ou false
vous pouvez faire:
when(b) {
true -> {}
false -> {}
}
Si vous voulez vérifier si c'est null
, vous pouvez ajouter cela (ou else
) en tant que valeur dans le when
:
when(b) {
true -> {}
false -> {}
null -> {}
}
when(b) {
true -> {}
false -> {}
else-> {}
}
Kotlin analysera statiquement vos contrôles nuls. C'est bon:
val b: Boolean? = null
if (b != null && b) {
println(b)
}
Même si cela échoue avec une erreur de type:
val b: Boolean? = null
if (b == null && b) {
println(b)
}
Pour plus d'informations, voir: http://kotlinlang.org/docs/reference/null-safety.html
Vous pouvez également utiliser "opérateur nul de coalescence" (qui fonctionnera pour les variables mutables):
val b: Boolean? = null
if (b ?: false) {
println(b)
}
D'après ce que j'ai vu le booléen? est le résultat d'une méthode qui retourne une valeur booléenne sur un objet nullable
val person: Person? = null
....
if(person?.isHome()) { //This won't compile because the result is Boolean?
//Do something
}
La solution que j’utilise est d’utiliser la fonction let
pour supprimer la valeur NULL renvoyée, comme ceci.
person?.let {
if(it.isHome()) {
//Do something
}
}
Pour Kotlin, ce que j’utilise normalement est if (object?.booleanProperty ==true) { //do stuff }
, cela ne fonctionnerait que lorsque la propriété est vraie et que l’objet n’est pas nul. Pour l'inverse: if (!object?booleanProperty !=true) { //do Stuff}
À Kotlin, vous pouvez faire comme ceci:
val b: Boolean? = true
if (b == true) { // if b is null, this should be null == true
/* Do something */
} else {
/* Do something else */
}
Utilisons un if-else
instruction avec un Elvis Operator
:
val a: Boolean?
val b: Boolean?
a = true
b = null
if (a != null ?: b) {
println("One of them isn't nullable...")
} else {
println("Both are nullables!")
}
// Résultat: "L'un d'eux n'est pas nullable ..."
a = null
b = null
if (a != null ?: b) {
println("One of them isn't nullable...")
} else {
println("Both are nullables!")
}
// Résultat: "Les deux sont nullables!"
Il est assez facile d'ajouter une fonction d'extension si cela vous aide.
fun Boolean?.orDefault(default: Boolean = false): Boolean {
if (this == null)
return default
return this
}
var x: Boolean? = null
if(x.orDefault()) {
..
}