Ответ 1
С помощью оператора равенства можно сравнить значение с нулевым значением с true
, false
или null
:
var b: Boolean? = null
if (b == true) {
// b was not null and equal true
}
Если у меня есть nullable Boolean b
, я могу сделать следующее сравнение в Java:
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 */
}
Однако использование !!
для меня немного отрывочно, обходя нулевую систему безопасности.
Есть ли более элегантный подход для этого?
Редактировать. Кажется, я немного упростил. Для локальных переменных, как показывает 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-> {}
}
Котлин будет статически анализировать ваши нулевые проверки. Это отлично:
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)
}
Из того, что я видел в булеанском? является результатом метода, который возвращает Boolean для объекта с нулевым значением
val person: Person? = null
....
if(person?.isHome()) { //This won't compile because the result is Boolean?
//Do something
}
Решением, которое я использовал, является использование функции let
для удаления возможного возвращаемого нулевого значения, например:
person?.let {
if(it.isHome()) {
//Do something
}
}
Для Kotlin я обычно использую if (object?.booleanProperty ==true) {//do stuff }
это будет работать только тогда, когда свойство имеет значение true, а объект не является нулевым. И наоборот: 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 */
}
сначала добавьте пользовательскую встроенную функцию ниже:
inline fun Boolean?.ifTrue(block: Boolean.() -> Unit): Boolean? {
if (null != this && this) {
block()
}
return this
}
inline fun Boolean?.ifFalse(block: Boolean?.() -> Unit): Boolean? {
if (null == this || !this) {
block()
}
return this
}
тогда вы можете написать код следующим образом:
val b: Boolean? = ...
b.ifTrue {
/* Do something in true case */
}
//or
b.ifFalse {
/* Do something else in false case */
}
Давайте использовать оператор 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!")
}
//Результат: "Один из них не обнуляемый..."
a = null
b = null
if (a != null ?: b) {
println("One of them isn't nullable...")
} else {
println("Both are nullables!")
}
//Результат: "Оба обнуляемы!"
Довольно легко добавить функцию расширения, если это вам поможет.
fun Boolean?.orDefault(default: Boolean = false): Boolean {
if (this == null)
return default
return this
}
var x: Boolean? = null
if(x.orDefault()) {
..
}