Se eu tiver um valor nulo Boolean b
, posso fazer a seguinte comparação em Java:
Boolean b = ...;
if (b != null && b) {
/* Do something */
} else {
/* Do something else */
}
No Kotlin, posso obter o mesmo usando o !!
operador:
val b: Boolean? = ...
if (b != null && b!!) {
/* Do something */
} else {
/* Do something else */
}
No entanto, o uso de me !!
parece um pouco superficial, contornando o sistema de segurança nulo.
Existe uma abordagem mais elegante para isso?
Editar Parece que eu simplifiquei um pouco demais. Para variáveis locais, como mostra Banthar , funciona. No entanto, meu booleano b
é na verdade uma "propriedade com um campo de apoio" (não estou realmente atualizado ainda sobre o que isso impõe). Este é o resultado:
!!b
e não simplesmenteb
? (Eu não sou tão familiarizado com Kotlin, apenas curiosidades)b
pode sernull
e um dos recursos do Kotlin é o Null Safety , que fornece erros de compilação ao tentar avaliar referências anuláveis. Assim, usando simplesb
dá um erro de compilação :)b != nil
entenderá isso antes de verificar o lado direito?val r = b?doSomething() ?: doSomethingElse()
deveria funcionar.Respostas:
Você pode comparar booleano anulável com
true
,false
ounull
utilizando operador de igualdade:fonte
!
true
,false
ounull
. Em seguida, ao fazerif (b != true)
você só sabe que b não é verdade, mas você não sabe nada sobrefalse
ounull
if (b != true) // b is null or false
eg3.if (b == false) // b is false
Se você deseja verificar corretamente se um
Boolean?
étrue
oufalse
pode:Se você quiser verificar se é
null
possível, pode adicionar isso (ouelse
) como um valor nowhen
:fonte
O Kotlin analisará estaticamente suas verificações nulas. Isto é bom:
Mesmo que isso falhe com o erro de tipo:
Para mais informações, consulte: http://kotlinlang.org/docs/reference/null-safety.html
Você também pode usar o "operador coalescente nulo" (que funcionará para variáveis mutáveis):
fonte
var
?) ... se for um localvar
, o compilador ainda pode permitir a transmissão segura. Para casos mais especiais, leia stackoverflow.com/questions/34498562/…val booleanVal = nullableProducer?.produceVal() ?: false; if (booleanVal) {}
Pelo que eu vi o booleano? é o resultado de um método que retorna Booleano em um objeto que é anulável
A solução que estou usando é usar a
let
função para remover o possível valor nulo retornado dessa formafonte
if
bloco porperson?.isHome() == true
.No Kotlin, você pode fazer assim:
fonte
b != null && b == true
é o mesmo queb == true
.primeiro, adicione a função embutida personalizada abaixo:
então você pode escrever um código como este:
fonte
Para Kotlin, o que eu normalmente uso é
isso funcionaria apenas quando a propriedade for verdadeira e o objeto não for nulo. Pelo contrário:
fonte
Vamos usar uma
if-else
declaração com umElvis Operator
:fonte
É muito fácil adicionar uma função de extensão, se isso o ajudar.
fonte
fonte
Você pode fazer com o operador seguro "let"
fonte