ヌル可能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
は、実際には「バッキングフィールドを持つプロパティ」です(実際にはまだ速度が向上していませんが、これが課しているものです)。これが結果です:
等値演算子を使用して、ヌル可能ブール値をtrue
、false
、またはnull
と比較できます。
var b: Boolean? = null
if (b == true) {
// b was not null and equal true
}
Boolean?
がtrue
であるかfalse
であるかを明確に確認する場合は、次の操作を実行できます。
when(b) {
true -> {}
false -> {}
}
null
であるかどうかを確認する場合は、else
の値としてそれ(またはwhen
)を追加できます。
when(b) {
true -> {}
false -> {}
null -> {}
}
when(b) {
true -> {}
false -> {}
else-> {}
}
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)
}
私がブール値を見たことから? 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
}
}
Kotlinの場合、私が通常使用するのはif (object?.booleanProperty ==true) { //do stuff }
です。これは、プロパティがtrueでオブジェクトがnullでない場合にのみ機能します。逆の場合:if (!object?booleanProperty !=true) { //do Stuff}
Kotlinでは、次のようにできます。
val b: Boolean? = true
if (b == true) { // if b is null, this should be null == true
/* Do something */
} else {
/* Do something else */
}
if-else
でElvis 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値を許可します!」
それがあなたを助けるならば、拡張機能を追加することはかなり簡単です。
fun Boolean?.orDefault(default: Boolean = false): Boolean {
if (this == null)
return default
return this
}
var x: Boolean? = null
if(x.orDefault()) {
..
}