web-dev-qa-db-fra.com

Utilisation de Boolean? dans si expression

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:

enter image description here

99
nhaarman

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
}
150
Ilya

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-> {}
}
24
Eliezer

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)
}
20
Piotr Praszmo

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
  }
}
6
DroidT

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}

1
John

À 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 */
}
1
ininmm

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!"

0
ARGeo

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()) {
..
}
0
Nic Bell