2016-06-03 27 views
13

Ist es möglich, so etwas zu schreiben, oder müssen wir in Kotlin zurück zur manuellen Nullprüfung?Wie Match-Optionals in Kotlin Muster?

val meaningOfLife : String? = null 

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

das 'if' Konstrukt ist für binäre Situationen wie dieses vorzuziehen. Hat genau den gleichen Effekt wie "wenn" hier – voddan

+0

Warum ist es vorzuziehen, wenn es den gleichen Effekt hat? Der Vorteil von 'when' ist, dass es Platz zum Wachsen gibt. – TomTom

+0

Im Falle der Null-Fähigkeit 'when' hat nichts zu wachsen. 'When' als ein verklärtes 'if' zu verwenden, ist ziemlich verschwenderisch IMO – voddan

Antwort

13

Eine mögliche Wege ist null zuerst übereinstimmen, so dass in else Zweig Die String? wird implizit konvertiert zu String:

val meaningOfLife: String? = null 

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

Dies ist ein Spezialfall eines smart cast vom Compiler ausgeführt.

Ähnliche Wirkung kann mit is String und else Zweigen erreicht werden - is String -Überprüfung ist wahr, wenn der Wert nicht null ist.

Weitere Idiome zur Nullsicherheit finden Sie unter this answer.

+1

Wenn man' is String' im ersten Fall erstellt, wird ein ähnlicher Effekt erzielt. – EPadronU

+1

@EPadronU, nicht vollständig: wie aus bytecode Perspektive gesehen, ist 'ist String' verursacht 'instanceof' Prüfung, während der Code in der Antwort nicht, es vergleicht nur die Referenz mit' null'. – hotkey

+0

Danke. Das ist sehr nützlich zu wissen. Zum Glück habe ich "ähnlich" gesagt;) – EPadronU

11

Sie können das erreichen, wie folgt:

val meaningOfLife: String? = null 

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

Try this:

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

let in stdlib

+2

OP wollte wissen, wie man Mustervergleiche dazu verwendet. Wie auch immer, ich denke, dass Ihr Ausdruck könnte bis zu diesem gereinigt werden: 'println (BedeutungOfLife?:" Es gibt keine Bedeutung ")' – marstran

+1

überkompliziert IMO. Ein einfaches 'if' ist viel besser lesbar – voddan

1

FYI, die besondere Situation in der Frage hat eine Art und Weise einfache Lösung mit dem ?: Betreiber Standardwert:

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

Das Beispiel in der Frage ist wahrscheinlich eine vereinfachte reale Situation, so dass eine NULL-Prüfung ist, wie Ich würde es machen. IMHO if ist ein besserer Weg zu gehen, wenn Sie eine binäre wählte der Steuerfluss haben:

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

nimmt genau die gleiche Anzahl von Zeilen, BTW.

+0

Ich verstehe die Frage war wahrscheinlich nicht darüber, aber ich denke, diese Option sollte auch erwähnt werden – voddan