Qual é o equivalente dessa expressão no Kotlin?
a ? b : c
Este código não é válido no Kotlin.
kotlin
conditional-operator
Drew Noakes
fonte
fonte
Respostas:
No Kotlin,
if
declarações são expressões. Portanto, o seguinte código é equivalente:A distinção entre expressão e afirmação é importante aqui. Em Java / C # / JavaScript,
if
forma uma instrução, o que significa que ela não resolve para um valor. Mais concretamente, você não pode atribuí-lo a uma variável.Se você vem de um idioma em que
if
há uma declaração, isso pode parecer pouco natural, mas esse sentimento deve diminuir em breve.fonte
when
.x = a==b
b + if (a) c else d
vs.b + (c if (a) else d)
O último requer parênteses adicionais. porquec
não é delimitada pela condição eelse
.Você pode definir sua própria
Boolean
função de extensão que retornanull
quandoBoolean
forfalse
fornecer uma estrutura semelhante ao operador ternário:Isso faria uma
a ? b : c
expressão ser traduzida paraa then b ?: c
, assim:Atualização: Mas, para fazer uma troca condicional semelhante a Java, você precisará de algo assim
infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null
println(condition then { "yes" } ?: "no")
preste atenção na lambda. seu cálculo de conteúdo deve ser adiada até que nós temos certezacondition
étrue
Este parece desajeitado, é por isso que existe uma solicitação muito alta para portar o operador ternário Java no Kotlin
fonte
infix inline fun<T> Boolean.then(param: ()->T):T? = if(this) param() else null
true then { null } ?: "not-null"
?:
operador aqui éelvis-operator
: kotlinlang.org/docs/reference/null-safety.html#elvis-operatorTL; DR
é o que você pode usar em vez da expressão do operador ternário
a ? b : c
.Em Kotlin, muitas declarações de controle, incluindo
if
,when
ou até mesmotry
pode ser usado como expressões . Isso significa que aqueles podem ter um resultado que pode ser atribuído a uma variável, retornado de uma função etc.Sintaticamente, não há necessidade de operador ternário
Como resultado das expressões de Kotlin, a linguagem realmente não precisa do operador ternário .
é o que você pode usar em vez da expressão do operador ternário
a ? b : c
.Penso que a ideia é que a expressão anterior seja mais legível, pois todo mundo sabe o que
ifelse
faz, ao passo que não? :
é claro se você ainda não conhece a sintaxe.No entanto, tenho que admitir que muitas vezes sinto falta do operador ternário mais conveniente.
Outras alternativas
quando
Você também pode ver
when
construções usadas no Kotlin quando as condições são verificadas. É também uma maneira de expressar o cascalho if-else de uma maneira alternativa. O seguinte corresponde ao exemplo do OTs.Extensões
Como mostram muitos bons exemplos ( Operador condicional do Kotlin Ternary ) nas outras respostas, as extensões também podem ajudar na solução do seu caso de uso.
fonte
Para mim, eu uso as seguintes funções de extensão:
O primeiro retornará o valor padrão fornecido, caso o objeto seja igual a nulo. O segundo avaliará a expressão fornecida em lambda no mesmo caso.
Uso:
Pessoalmente, para mim, o código acima é mais legível do que a
if
construção embutidafonte
e.getMessage() ?: "unknown"
. O segundo pode ser expresso comoobj?.lastMessage?.timestamp ?: { Date() }()
O equivalente em Java do operador ternário
é um IF simples no Kotlin em uma linha
https://kotlinlang.org/docs/reference/control-flow.html#if-expression
Caso especial para comparação nula
você pode usar o operador Elvis
fonte
Não há operador ternário no kotlin, pois o
if else
bloco retorna valorentão, você pode fazer: em
val max = if (a > b) a else b
vez de javamax = (a > b) ? b : c
Também podemos usar a
when
construção, mas também retornamos valor:Aqui está o link para a documentação do kotlin: Fluxo de Controle: se, quando, por, enquanto
fonte
fonte
Alguns casos de canto não mencionados em outras respostas.
Desde a aparência do takeIf no Kotlin 1.1, o operador ternário
a ? b : c
também pode ser expresso assim:Isso fica ainda mais curto caso c seja
null
:Observe também que, no mundo Java, as verificações nulas típicas, como
value != null ? value : defaultValue
traduzir no otomático Kotlin para justvalue ?: defaultValue
.Semelhante
a != null ? b : c
pode ser traduzido paraa?.let { b } ?: c
.fonte
b.takeIf { a } ?: c
mais curto e mais legível do queif (a) b else c
? Terneray operador é certamente uma característica ausente em Kotlin desde nomes de variáveis ea condição pode ser longo e fazer você dividir a linha que é ruimtakeIf
sempre avalia o caso real (aquia
). Essa expressão não só pode ser computada inutilmente sea
for falsa, mas você não pode se beneficiar de lançamentos inteligentes à laif (a is Int) { a + 3 }
.{ a }
é um lambda avaliado preguiçosamente.b
)". Mas mesmo{ a }
sendo preguiçoso, deve ser avaliado para determinar o resultado da expressão.Dê uma olhada nos documentos :
fonte
Java
Equivalente a Kotlin:
fonte
TAREFA :
Vamos considerar o seguinte exemplo:
Precisamos do seguinte equivalente no Kotlin:
SOLUÇÕES :
1.a . Você pode usar
if-expression
no Kotlin:1.b . Pode ser muito melhor se você virar isso
if-expression
(vamos fazê-lo semnot
):2 . O operador Elvis da Kotlin
?:
pode fazer um trabalho ainda melhor:3 . Ou use um
Extension function
para aAnswer
classe correspondente :4 . Usando o
Extension function
você pode reduzir um código graças aElvis operator
:5 . Ou apenas use o
when
operador:Espero que isto ajude.
fonte
quando substitui o operador do comutador de idiomas do tipo C. Na forma mais simples, parece com isso
fonte
when
uma declaração, não uma expressão. Uma comparação mais relevante com expressões condicionais ternárias seria fazer com que cada ramificação retornasse um valor, de modo que a expressão quando inteira fosse avaliada como um valor (como acontece com as condicionais ternárias).Não há operador ternário em Kotlin. Parece problemático à primeira vista. Mas pense que podemos fazê-lo com a instrução inline if else, porque esta é a expressão aqui. Simplesmente temos que fazer -
Aqui, podemos outra coisa se bloquearmos o número necessário. Gostar-
Portanto, essa linha é tão simples e muito legível que o operador ternário. quando usamos mais de um operador ternário em java, isso parece horrível. Mas aqui temos uma sintaxe clara. até nós podemos escrever em várias linhas também.
fonte
Você pode usar
var a= if (a) b else c
no lugar do operador ternário.Outro bom conceito de kotlin é o operador de Elvis. Você não precisa verificar nulo sempre.
Isso retornará length se b não for nulo, caso contrário, ele executará a instrução do lado direito.
fonte
como Drew Noakes citou, o kotlin usa if declaração como expressão, portanto o Operador Condicional Ternário não é mais necessário,
mas com a função de extensão e sobrecarga de infix, você pode implementar isso sozinho, aqui está um exemplo
então use-o assim
fonte
Outra abordagem interessante seria usar
when
:Pode ser bastante útil em alguns cenários mais complexos. E honestamente, é mais legível para mim do que
if ... else ...
fonte
Você pode fazer isso de várias maneiras em Kotlin
Usando se
Usando quando
Segurança nula
fonte
Não existe uma operação ternária no Kotlin, mas existem algumas maneiras divertidas de contornar isso. Como outros já apontaram, uma tradução direta para o Kotlin seria assim:
Mas, pessoalmente, acho que isso pode ficar um pouco confuso e difícil de ler. Existem outras opções embutidas na biblioteca. Você pode usar o takeIf {} com um operador elvis:
O que está acontecendo lá é que o comando takeIf {} retorna seu resultado1 ou nulo, e o operador elvis lida com a opção nula. Existem algumas opções adicionais, takeUnless {}, por exemplo:
A linguagem é clara, você sabe o que está fazendo.
Se for uma condição comumente usada, você também pode fazer algo divertido, como usar um método de extensão em linha. Vamos supor que desejamos rastrear uma pontuação do jogo como um Int, por exemplo, e queremos sempre retornar 0 se uma determinada condição não for atendida:
Ok, isso parece feio. Mas considere como fica quando é usado:
Como você pode ver, o Kotlin oferece muita flexibilidade na maneira como você escolhe expressar seu código. Existem inúmeras variações dos meus exemplos e, provavelmente, maneiras que ainda nem descobri. Eu espero que isso ajude!
fonte
takeIf
é minha opção favorita, de fato, muito elegante.Lembre-se de operador Ternary e operador Elvis possuem significados separados no Kotlin, diferentemente de muitos idiomas populares. Fazer
expression? value1: value2
daria a você palavrões pelo compilador Kotlin , diferente de qualquer outro idioma, pois não há um operador ternário no Kotlin, conforme mencionado nos documentos oficiais . O motivo é que as próprias declarações if, when e try-catch retornam valores.Então, fazer
expression? value1: value2
pode ser substituído porO operador Elvis que Kotlin possui, funciona apenas no caso de variáveis anuláveis, ex .:
Um entendimento mais claro pode ser alcançado com essas respostas .
fonte
Você pode usar
if
expressão para isso no Kotlin. No Kotlinif
é uma expressão com um valor de resultado. Então, em Kotlin, podemos escrevere em Java podemos conseguir o mesmo, mas com código maior
fonte
Se você não fizer o que usar a notação padrão, também poderá criar / simular usando infix com algo como isto:
crie uma classe para manter sua meta e resultado:
crie algumas funções infix para simular uma operação ternária
Então você poderá usá-lo assim:
fonte
Outra abordagem curta para usar
Aqui, o próprio kotlin verifica o valor nulo e, se for nulo, passa o valor da string vazia.
fonte
Por que alguém usaria algo assim:
quando você pode realmente usar algo assim (
a
neste caso, é booleano):fonte
? and :
contradiz com a declaração anulável / tipo, em vez de uma verificação de tipo. Além disso, não vejo motivo. Eu acho que alguém definitivamente pensaria um pouco, se houver uma verificação de condição em caso contrário. Vamos esperar e ver nas versões futuras.Ao trabalhar com apply (), deixe parecer muito útil ao lidar com operações ternárias, pois é mais elegante e oferece espaço para você
fonte
Com as seguintes funções infix, posso cobrir muitos casos de uso comuns da mesma maneira que em Python:
fonte
Não há operador ternário em Kotlin; os mais fechados são os dois casos abaixo,
Documentos de referência
fonte
No kotlin, se você estiver usando ?: Funcionará como se a instrução retornasse nula, então :: 0 levará 0 ou o que quer que você tenha escrito deste lado.
fonte
No Kotlin você pode usar operações ternárias como esta:
val x = if(a) "add b" else "add c"
fonte
Depois de pesquisar outras idéias, deduzi o seguinte operador ternário:
Exemplo (execute aqui ):
Esta versão é fluente e não entra em conflito com o operador coalescente nulo.
fonte
then
vez deyes
.