2015-09-28 13 views
46

場合で私がNULL可能Boolean bを持っている場合は、私はJavaで次の比較を行うことができます。Kotlinでブール値の使用?表現

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

、私は!!オペレータ使用して同じことを達成することができます。しかし

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

!!の使用は、ヌル安全システムを回避して、私には少し不慣れだと感じます。

これはもっと優雅なアプローチですか?


編集私が少しoversimplicatedようです。ローカル変数の場合、Bantharが示すように、動作します。しかし、私のブールbは、実際には "バッキングフィールドを持つプロパティ"です(私は実際にこれが課すものは何もスピードアップしていません)。これが結果です:

enter image description here

+0

単純に 'b'ではなく' b'ですか? – Maroun

+0

@MarounMaroun 'b'は' null'で、Kotlinの機能の1つは[Null Safety]です(http://kotlinlang.org/docs/reference/null- safety.html#the - 演算子)、null可能な参照を評価しようとするとコンパイルエラーが発生します。したがって、普通の 'b'を使用するとコンパイルエラーが発生します:) – nhaarman

+0

しかし、' b!= nil'は右側をチェックする前にそれをキャッチしませんか? – Maroun

答えて

61

とヌル値ブール値を比較できますあなたはきれいBoolean?はあなたが行うことができますtruefalseであるかどうかを確認したい場合は

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

を参照してください。注意:逆演算子 '! 'で動作しないようです。 – Richard

15

Kotlinは静的にヌルチェックを分析します。これは問題ありません:

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

これは型エラーで失敗にもかかわらず:http://kotlinlang.org/docs/reference/null-safety.html

ます。また、「null合体演算子」を使用することができます(変更可能なために動作します:詳細を参照してください

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

変数):

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

分析は不変値。これを可変フィールドにする必要がある場合は、一時的なローカル変数に格納します。 –

+1

それは確かに意味があります。おそらく、ヌル合体オペレータが私が探していたものです。ありがとう! – nhaarman

+0

@Bantharが完全に正しくない(2番目の例は 'var'でしょうか?)...ローカルの' var'の場合、コンパイラは安全なキャストを許可することができます。もっと特殊なケースについては、http://stackoverflow.com/questions/34498562/in-kotlin-what-is-the-idiomatic-way-to-deal-with-nullable-values-referencing-o/34498563#34498563 –

7

:等価演算子を使用して、falseまたはnull

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

あなたはそれはあなたができるnullだかどうかを確認したい場合whenの値としてその(又はelse)を追加:

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

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

ブールを見ましたか?私が使用してきたソリューションはそう

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

' if?'ブロックを 'person?.isHome()== true'に置き換えると、最初のコンパイルがコンパイルされます。 – Hesam

1
などの可能返されたNULL値を削除するには let機能を使用することです
val person: Person? = null 
.... 
if(person?.isHome()) { //This won't compile because the result is Boolean? 
    //Do something 
} 

NULL可能であるオブジェクトにブールを返すメソッドの結果であります

私が通常使っているものは if (object?.booleanProperty ==true) { //do stuff } です。これは、プロパティがtrueで、オブジェクトがnullでない場合にのみ機能します。逆の場合: if (!object?booleanProperty !=true) { //do Stuff}

関連する問題