Если у меня есть значение Boolean b
, допускающее значение NULL , я могу выполнить следующее сравнение на 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 Кажется, я немного упростил. Для локальных переменных, как показывает Бантар , это работает. Однако мое логическое значение b
на самом деле является «свойством с резервным полем» (я еще не совсем понимаю, что это налагает). Вот результат:
!!b
и не простоb
? (Я не так хорошо знаком с котлином, просто любопытство)b
может быть,null
и одной из функций Kotlin является Null Safety , которая дает ошибки компиляции при попытке оценить ссылки, допускающие значение NULL. Таким образом, использование plainb
дает ошибку компиляции :)b != nil
поймете это, пока не проверите правую сторону?val r = b?doSomething() ?: doSomethingElse()
должно работать.Ответы:
Вы можете сравнить логическое значение, допускающее значение NULL
true
,false
илиnull
с помощью оператора равенства:источник
!
true
,false
илиnull
. Тогда, когдаif (b != true)
вы делаете это, вы знаете только, что b не соответствует действительности, но вы ничего не знаете оfalse
илиnull
if (b != true) // b is null or false
EG3.if (b == false) // b is false
Если вы хотите чисто проверить , является ли
Boolean?
этоtrue
илиfalse
вы можете сделать:Если вы хотите проверить, можете ли
null
вы добавить это (илиelse
) как значение вwhen
:источник
Kotlin будет статически анализировать ваши нулевые проверки. Это отлично:
Даже если это не удается с ошибкой типа:
Подробнее см .: http://kotlinlang.org/docs/reference/null-safety.html.
Вы также можете использовать «нулевой оператор объединения» (который будет работать для изменяемых переменных):
источник
var
?) ... если он локальный,var
то компилятор все еще может разрешить безопасное приведение. Для других особых случаев прочтите stackoverflow.com/questions/34498562/…val booleanVal = nullableProducer?.produceVal() ?: false; if (booleanVal) {}
Из того, что я видел логическое значение? является результатом метода, который возвращает логическое значение для объекта, допускающего значение NULL
Решение, которое я использовал, - использовать
let
функцию для удаления возможного возвращаемого нулевого значения, напримеристочник
if
блок наperson?.isHome() == true
.В Kotlin это можно сделать так:
источник
b != null && b == true
такое же, какb == true
.сначала добавьте настраиваемую встроенную функцию ниже:
тогда вы можете написать такой код:
источник
Для Котлина я обычно использую
это будет работать, только если свойство истинно, а объект не равен нулю. Для обратного:
источник
Давайте использовать
if-else
оператор сElvis Operator
:источник
Если это вам поможет, довольно легко добавить функцию расширения.
источник
источник
Можно обойтись безопасным Оператором «пусть»
источник