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

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

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

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

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

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

 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.

Вы также можете использовать оператор «null coalescing» (который будет работать для изменяемых переменных):

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

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

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

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

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

Из того, что я видел в булеанском? является результатом метода, который возвращает Boolean на объект, который является NULL

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