2016-06-03 25 views
13

È possibile scrivere qualcosa di simile o dobbiamo tornare al controllo null manuale in Kotlin?Come modellare gli optionals in Kotlin?

val meaningOfLife : String? = null 

when meaningOfLife { 
    exists -> println(meaningOfLife) 
    else -> println("There's no meaning") 
} 
+0

il costrutto 'if' è più preferibile per situazioni binarie come questa. Ha lo stesso identico effetto di quando? Qui – voddan

+0

Perché è preferibile se ha lo stesso effetto? Il vantaggio di "quando" è che ha spazio per crescere. – TomTom

+0

In caso di nullability 'quando' non ha nulla per cui crescere. Usare 'when' come glorificato' if' è abbastanza dispendioso IMO – voddan

risposta

13

Uno dei modi possibili è quello di abbinare null prima in modo che in else ramo lo String? viene convertito in modo implicito a String:

val meaningOfLife: String? = null 

when (meaningOfLife) { 
    null -> println("There's no meaning") 
    else -> println(meaningOfLife.toUpperCase()) //non-nullable here 
} 

Questo è un caso speciale di un smart cast eseguita dal compilatore.

Effetto simile può essere ottenuto con i rami is String e else - is String -check è true quando il valore non è nullo.

Per ulteriori idiomi relativi alla sicurezza nulla vedere this answer.

+1

La creazione di' is String' nel primo caso ottiene un effetto simile. – EPadronU

+1

@EPadronU, non completamente: come visto dalla prospettiva bytecode, 'is String' causa il controllo' instanceof', mentre il codice nella risposta no, confronta solo il riferimento con 'null'. – hotkey

+0

Grazie. È molto utile sapere. Fortunatamente, ho detto "simile";) – EPadronU

11

È possibile realizzare questo come segue:

val meaningOfLife: String? = null 

when (meaningOfLife) { 
    is String -> println(meaningOfLife) 
    else -> println("There's no meaning") 
} 
0

Prova questa:

val meaningOfLife : String? = null  
meaningOfLife?.let { println(it) } ?: println("There's no meaning") 

let in stdlib

+2

OP voleva sapere come usare la corrispondenza dei modelli per farlo. Ad ogni modo, penso che la tua espressione possa essere ripulita da questa: 'println (che significaOfLife?:" Non ha senso ")' – marstran

+1

IMO complicato. Un semplice 'if' è molto più leggibile – voddan

1

proposito, la situazione particolare in questione ha un modo semplice soluzione con la ?: operatore del valore predefinito:

println(meaningOfLife ?: "There's no meaning") 

Nell'esempio in questione è probabilmente una situazione reale semplificato, così un controllo nullo è come Lo farei. IMHO if è un modo migliore per andare quando si dispone di un binario ha scelto di flusso di controllo:

if(meaningOfLife != null) 
    println(meaningOfLife) 
else 
    println("There's no meaning") 

prende esattamente lo stesso numero di linee, BTW.

+0

Capisco che probabilmente la domanda non lo riguarda, ma penso che questa opzione dovrebbe essere menzionata – voddan