2015-09-28 9 views
46

Jeśli mam zerowalne Boolean b mogę zrobić następujące porównania w Java:Użycie logiki Boolean? jeśli wyrażenie

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

W Kotlin, mogę osiągnąć to samo za pomocą operatora !!:

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

jednak , korzystanie z !! wydaje mi się nieco pobieżne, omijając system bezpieczeństwa zerowy.

Czy istnieje bardziej eleganckie podejście do tego?


Edit Wydaje mi oversimplicated trochę. W przypadku zmiennych lokalnych, jak pokazuje Banthar, działa. Jednak mój Boolean b jest w rzeczywistości "własnością z polem zaplecza" (nie jestem w stanie jeszcze przyspieszyć tego, co to narzuca). Jest to wynikiem:

enter image description here

+0

Dlaczego potrzebujesz '!!b "a nie po prostu" b "? (Nie jestem zaznajomiony z kotlinami, tylko z ciekawostkami) – Maroun

+0

@MarounMaroun Ponieważ 'b' może być' null' i jedną z cech Kotlina jest [Null Safety] (http://kotlinlang.org/docs/reference/null- safety.html # the - operator), co daje błędy kompilacji przy próbie oceny referencji zerowych. Zatem użycie zwykłego 'b' daje błąd kompilacji :) – nhaarman

+0

Ale czy' b! = Nil' nie złapie tego przed sprawdzeniem prawej strony? – Maroun

Odpowiedz

61

Można porównać wartość null z wartością boolowską z true, false lub null stosując operator równości:

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

Uwaga: nie działa z operatorem odwrotnym '!' – Richard

15

Kotlin będzie statycznie analizowania zerowe kontrole. To jest w porządku:

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

Nawet jeśli to się nie powiedzie z typu błędu:

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

Dla więcej zobacz: http://kotlinlang.org/docs/reference/null-safety.html

Można również użyć "null operator koalescencyjne" (która będzie działać na zmienny zmienne):

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

Analiza działa tylko dla niezmiennych wartości. Jeśli chcesz to zrobić w zmiennym polu, zapisz go w tymczasowej zmiennej lokalnej. –

+1

To rzeczywiście ma sens. Null koalescing operator jest prawdopodobnie tym, czego szukałem. Dzięki! – nhaarman

+0

@Banthar, który nie jest całkowicie poprawny (twoim drugim przykładem byłby 'var'?) ... jeśli jest to lokalny' var', to kompilator nadal może zezwolić na bezpieczne rzutowanie. Więcej wyjątkowych przypadków można znaleźć na stronie http://stackoverflow.com/questions/34498562/in-kotlin-what-is-the-idiomatic-way-to-deal-withulul-wprawidłowych-referencjach-o/34498563#34498563 –

7

Jeśli chcesz czysto sprawdzić czy Boolean? jest true lub false można zrobić:

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

Jeśli chcesz sprawdzić, czy to null co możliwe dodać (lub else) jako wartość w wartości when:

1

Z tego, co widziałem Boolean? jest wynikiem metody, która zwraca wartość logiczną na obiekcie, który jest pustych

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

Rozwiązanie używam jest użycie funkcji let aby usunąć ewentualne zwracana wartość null jak tak

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

Pierwszy kompiluje się, jeśli zastąpisz blok 'if' przez' person? .isHome() == true'. – Hesam

1

Dla Kotlin to, czego normalnie używam, to: if (object?.booleanProperty ==true) { //do stuff } działa to tylko wtedy, gdy właściwość ma wartość true, a obiekt nie jest pusty. Na odwrót: if (!object?booleanProperty !=true) { //do Stuff}

Powiązane problemy