2015-09-28 4 views
46

Wenn ich ein Nullable-Boolean b habe, kann ich den folgenden Vergleich in Java tun:Verwendung von Boolean? in, wenn Ausdruck

val b: Boolean? = ... 
if (b != null && b!!) { 
    /* Do something */ 
} else { 
    /* Do something else */ 
} 

jedoch:

Boolean b = ...; 
if (b != null && b) { 
    /* Do something */ 
} else { 
    /* Do something else */ 
} 

In Kotlin, ich das gleiche mit Hilfe des !! Operator erreichen kann , die Verwendung von !! fühlt sich ein bisschen skizzenhaft an, um das Nullsicherheitssystem zu umgehen.

Gibt es einen eleganteren Ansatz dafür?


bearbeiten Es scheint, dass ich ein bisschen oversimplicated. Für lokale Variablen, wie Banthar zeigt, funktioniert es. Allerdings ist mein Boolean b eigentlich eine "Eigenschaft mit einem Backing-Feld" (ich bin noch nicht wirklich auf dem Laufenden was das vorgibt). Dies ist das Ergebnis:

enter image description here

+0

Warum brauchen Sie '!!b' und nicht einfach 'b'? (Ich bin nicht so vertraut mit Kotlin, nur Kuriositäten) – Maroun

+0

@MarounMaroun Da 'b' kann' null' sein und eine von Kotlins Eigenschaften ist [Null Sicherheit] (http://kotlinlang.org/docs/reference/null- safety.html # the - operator), die Kompilierungsfehler beim Auswerten von Nullwertreferenzen verursacht. Also, die Verwendung von plain 'b' gibt einen Kompilierungsfehler :) – nhaarman

+0

Aber wird' b! = Nil' das nicht vor der Überprüfung der rechten Seite? – Maroun

Antwort

61

Sie nullable boolean mitvergleichen, false oder null mit Gleichheitsoperator:

var b: Boolean? = null 
if (b == true) { 
    // b was not null and equal true 
} 
+1

Hinweis: scheint nicht mit dem inversen Operator '' 'zu funktionieren' '' – Richard

15

Kotlin Ihre null prüft statisch analysieren. Das ist in Ordnung:

val b: Boolean? = null 
if(b!=null && b) { 
    println(b) 
} 

Auch wenn dies nicht gelingt mit Typ-Fehler:

val b: Boolean? = null 
if(b==null && b) { 
    println(b) 
} 

Mehr siehe: http://kotlinlang.org/docs/reference/null-safety.html

Sie können auch "null Koaleszierstruktur Operator" verwenden (die für wandelbar arbeiten Variablen):

val b: Boolean? = null 
if(b?:false) { 
    println(b) 
} 
+0

Die Analyse funktioniert nur für unveränderlich Werte. Wenn Sie dies für ein veränderbares Feld tun müssen, speichern Sie es in einer temporären lokalen Variablen. –

+1

Das macht in der Tat Sinn. Der Nullkoaleszenzoperator ist wahrscheinlich das, wonach ich gesucht habe. Vielen Dank! – nhaarman

+0

@Banthar das ist nicht vollständig korrekt (Ihr zweites Beispiel wäre 'var'?) ... Wenn es eine lokale' var' ist, dann kann der Compiler immer noch die sichere Besetzung erlauben. Für weitere Sonderfälle lesen Sie http://stackoverflow.com/questions/34498562/in-kotlin-what-is-the-idiomatic-way-to-deal-with-nullable-values-referencing-o/34498563#34498563 –

7

Wenn Sie sauber überprüfen möchten, ob ein Boolean? ist true oder false Sie tun können:

when(b) { 
    true -> {} 
    false -> {} 
} 

Wenn Sie überprüfen wollen, ob es null ist können Sie füge das hinzu (oder else) als einen Wert in dem when:

when(b) { 
    true -> {} 
    false -> {} 
    null -> {} 
} 

when(b) { 
    true -> {} 
    false -> {} 
    else-> {} 
} 
1

Von was ich den Boolean gesehen habe? ist ein Ergebnis eines Verfahrens, das Boolesche auf ein Objekt zurückgibt, das ich

val person: Person? = null 
.... 
if(person?.isHome()) { //This won't compile because the result is Boolean? 
    //Do something 
} 

Die Lösung habe mit verwenden, um die let Funktion, um den möglichen zurückNullWert zu entfernen, wie so

person?.let { 
    if(it.isHome()) { 
    //Do something 
    } 
} 
+1

Der erste kompiliert, wenn Sie 'if' Block durch' person ersetzen? .isHome() == true'. – Hesam

1
NULL-Werte zulässt

Für Kotlin, was ich normalerweise verwende ist if (object?.booleanProperty ==true) { //do stuff } dies würde nur funktionieren, wenn die Eigenschaft wahr ist und das Objekt nicht null ist. Für das Gegenteil: if (!object?booleanProperty !=true) { //do Stuff}