web-dev-qa-db-fra.com

Comment exécuter du code si l'objet est nul?

Dans Kotlin, je peux exécuter du code si un objet n'est pas nul comme ceci:

data?.let {
    ... // execute this block if not null
}

mais comment puis-je exécuter un bloc de code si l'objet est nul?

27
Toni Joe

Utilisez simplement un if normal:

if (data == null) {
  // Do something
}
14
Pixel Elephant

Vous pouvez utiliser elvis opérateur et évaluer un autre bloc de code avec run { ... }:

data?.let {
    // execute this block if not null
} ?: run {
    // execute this block if null
}

Mais cela ne semble pas aussi lisible qu'une simple instruction if-else.

En outre, vous pourriez trouver ces questions/réponses utiles:

88
hotkey

Vous pouvez créer une fonction d'infixe comme celle-ci:

infix fun Any?.ifNull(block: () -> Unit) { 
  if (this == null) block()
}

Ensuite, vous pouvez le faire:

data ifNull {
  // Do something
}
24
Dmitry Ryadnenko

Voici une syntaxe concise utilisant l'opérateur Elvis. Rappelez-vous que l'opérateur Elvis exécute uniquement le côté droit si le côté gauche est évalué à null.

data ?: doSomething()
11
M. Palsich

Vous pouvez utiliser le code ci-dessous

myNullable?.let {

} ?: { 
    // do something
}()

vous pouvez également omettre fun()

myNullable?.let {

} ?: fun() { 
    // do something
}()

ou vous pouvez appeler invoke() au lieu de ()

myNullable?.let {

} ?: fun() { 
    // do something
}.invoke()

Notez que le retour de valeur diffère comme ci-dessous.

val res0 = myNullable?.let {
} ?: () {

}()
val res1 = myNullable?.let {
} ?: fun() {
    "result"    
}()
val res2 = myNullable?.let {
} ?: () {
    "result"    
}()


println("res0:$res0")
println("res1:$res1")
println("res2:$res2")

RÉSULTAT:

res0:kotlin.Unit // () {} with empty
res1:kotlin.Unit // fun() {}
res2:result      // () {} with return
1
iroiroys