Подтвердить что ты не робот

Использование булевых? в выражении

Если у меня есть 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 на самом деле является "свойством с полем поддержки" (я пока не могу ускорить то, что это налагает). Это результат:

введите описание изображения здесь

4b9b3361

Ответ 1

С помощью оператора равенства можно сравнить значение с нулевым значением с true, false или null:

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

Ответ 2

Если вы хотите четко проверить, есть ли Boolean? true или false:

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

Если вы хотите проверить, может ли это null добавить (или else) в качестве значения в when:

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

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

Ответ 3

Котлин будет статически анализировать ваши нулевые проверки. Это отлично:

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)
}

Ответ 4

Из того, что я видел в булеанском? является результатом метода, который возвращает 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
  }
}

Ответ 5

Для Kotlin я обычно использую if (object?.booleanProperty ==true) {//do stuff } это будет работать только тогда, когда свойство имеет значение true, а объект не является нулевым. И наоборот: if (!object?booleanProperty !=true) {//do Stuff}

Ответ 6

В Kotlin вы можете сделать так:

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

Ответ 7

сначала добавьте пользовательскую встроенную функцию ниже:

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 */
}

Ответ 8

Давайте использовать оператор 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!")
}

//Результат: "Оба обнуляемы!"

Ответ 9

Довольно легко добавить функцию расширения, если это вам поможет.

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

var x: Boolean? = null

if(x.orDefault()) {
..
}