web-dev-qa-db-ja.com

ブール値の使用? if式

ヌル可能Boolean bがある場合、Javaで次の比較を行うことができます。

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

Kotlinでは、!!演算子を使用して同じことを実現できます。

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

ただし、!!の使用は、ヌルの安全システムを回避するために、少しわかりにくいと感じています。

これにもっとエレガントなアプローチはありますか?


Edit少し単純化しすぎたようです。ローカル変数の場合、 Banthar が示すように、機能します。しかし、私のBoolean bは、実際には「バッキングフィールドを持つプロパティ」です(実際にはまだ速度が向上していませんが、これが課しているものです)。これが結果です:

enter image description here

99
nhaarman

等値演算子を使用して、ヌル可能ブール値をtruefalse、またはnullと比較できます。

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

Boolean?trueであるかfalseであるかを明確に確認する場合は、次の操作を実行できます。

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

nullであるかどうかを確認する場合は、elseの値としてそれ(またはwhen)を追加できます。

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

when(b) {
    true -> {}
    false -> {}
    else-> {}
}
24
Eliezer

Kotlinはnullチェックを静的に分析します。これは結構です:

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

これはタイプエラーで失敗しますが:

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

詳細については、 http://kotlinlang.org/docs/reference/null-safety.html

「ヌル合体演算子」を使用することもできます(可変変数に対して機能します)。

val b: Boolean? = null
if (b ?: false) {
    println(b)
}
20
Piotr Praszmo

私がブール値を見たことから? null可能オブジェクトのブール値を返すメソッドの結果

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

私が使用してきた解決策は、let関数を使用して、返される可能性のあるnull値を削除することです。

person?.let {
  if(it.isHome()) {
    //Do something
  }
}
6
DroidT

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

1
John

Kotlinでは、次のようにできます。

val b: Boolean? = true
if (b == true) { // if b is null, this should be null == true
    /* Do something */
} else {
    /* Do something else */
}
1
ininmm

if-elseElvis Operatorステートメントを使用してみましょう:

val a: Boolean?
val b: Boolean?

a = true
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}

//結果:「そのうちの1つはnull入力不可...」

a = null
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}

//結果:「両方ともnull値を許可します!」

0
ARGeo

それがあなたを助けるならば、拡張機能を追加することはかなり簡単です。

fun Boolean?.orDefault(default: Boolean = false): Boolean {
    if (this == null)
        return default
    return this
}

var x: Boolean? = null

if(x.orDefault()) {
..
}
0
Nic Bell