¿Cuál es el equivalente de esta expresión en Kotlin?
a ? b : c
Este no es un código válido en Kotlin.
kotlin
conditional-operator
Drew Noakes
fuente
fuente
Respuestas:
En Kotlin, las
if
declaraciones son expresiones. Entonces el siguiente código es equivalente:La distinción entre expresión y declaración es importante aquí. En Java / C # / JavaScript,
if
forma una declaración, lo que significa que no se resuelve en un valor. Más concretamente, no puede asignarlo a una variable.Si vienes de un idioma donde
if
hay una declaración, esto puede parecer antinatural, pero ese sentimiento debería desaparecer pronto.fuente
when
.x = a==b
b + if (a) c else d
vs.b + (c if (a) else d)
El último requiere paréntesis adicionales. porquec
no está encerrado por la condición yelse
.Puede definir su propia
Boolean
función de extensión que se devuelvenull
cuandoBoolean
esfalse
proporcionar una estructura similar al operador ternario:Esto haría que una
a ? b : c
expresión se traduzca aa then b ?: c
, así:Actualización: Pero para hacer un cambio condicional más similar a Java, necesitará algo así
infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null
println(condition then { "yes" } ?: "no")
Presta atención a la lambda. su cálculo de contenido debe posponerse hasta que nos aseguremos de quecondition
seatrue
Este parece torpe, es por eso que existe una gran demanda para portar el operador ternario de Java a Kotlin
fuente
infix inline fun<T> Boolean.then(param: ()->T):T? = if(this) param() else null
true then { null } ?: "not-null"
?:
operador aquí eselvis-operator
: kotlinlang.org/docs/reference/null-safety.html#elvis-operatorTL; DR
es lo que puede usar en lugar de la expresión del operador ternario
a ? b : c
.En Kotlin, muchas declaraciones de control incluyen
if
,when
o inclusotry
se pueden usar como expresiones . Esto significa que esos pueden tener un resultado que puede asignarse a una variable, devolverse de una función, etc.Sintácticamente, no hay necesidad de operador ternario
Como resultado de las expresiones de Kotlin, el lenguaje no necesita realmente el operador ternario .
es lo que puede usar en lugar de la expresión del operador ternario
a ? b : c
.Creo que la idea es que la expresión anterior es más legible ya que todos saben qué
ifelse
hace, mientras no? :
está claro si aún no está familiarizado con la sintaxis.Sin embargo, debo admitir que a menudo extraño el operador ternario más conveniente.
Otras alternativas
cuando
También puede ver
when
construcciones utilizadas en Kotlin cuando se verifican las condiciones. También es una forma de expresar cascadas if-else en una forma alternativa. Lo siguiente corresponde al ejemplo de OT.Extensiones
Como muestran muchos buenos ejemplos ( Operador condicional ternario de Kotlin ) en las otras respuestas, las extensiones también pueden ayudarlo a resolver su caso de uso.
fuente
Para mí uso las siguientes funciones de extensión:
El primero devolverá el valor predeterminado proporcionado en caso de que el objeto sea igual a nulo. El segundo evaluará la expresión proporcionada en lambda en el mismo caso.
Uso:
Personalmente, para mí, el código anterior es más legible que la
if
construcción en líneafuente
e.getMessage() ?: "unknown"
. El segundo puede expresarse comoobj?.lastMessage?.timestamp ?: { Date() }()
El equivalente de Java del operador ternario
es un IF simple en Kotlin en una línea
https://kotlinlang.org/docs/reference/control-flow.html#if-expression
Caso especial para comparación nula
puedes usar el operador de Elvis
fuente
No hay operador ternario en kotlin, ya que el
if else
bloque devuelve valorentonces, puedes hacer: en
val max = if (a > b) a else b
lugar de Javamax = (a > b) ? b : c
También podemos usar
when
construcción, también devuelve valor:Aquí hay un enlace para la documentación de kotlin: Flujo de control: if, when, for, while
fuente
fuente
Algunos casos de esquina no mencionados en otras respuestas.
Desde la aparición de takeIf en Kotlin 1.1, el operador ternario
a ? b : c
también puede expresarse así:Esto se vuelve aún más corto en caso de que c sea
null
:También tenga en cuenta que las comprobaciones nulas típicas en el mundo Java, como
value != null ? value : defaultValue
traducir en Kotlin ideomático a justvalue ?: defaultValue
.Similar
a != null ? b : c
se puede traducir aa?.let { b } ?: c
.fuente
b.takeIf { a } ?: c
más corto y más legible queif (a) b else c
? Terneray operador es sin duda una característica que falta en Kotlin ya que los nombres de variable y la condición puede ser largo y que se divide la línea de lo que es malotakeIf
siempre evalúa el caso verdadero (aquía
). No solo se puede calcular esa expresión inútilmente sia
resulta ser falsa, sino que no se puede beneficiar de los lanzamientos inteligentes a la cartaif (a is Int) { a + 3 }
.{ a }
es una lambda perezosamente evaluada.b
)". Pero incluso{ a }
, aunque vago, debe evaluarse para determinar el resultado de la expresión.Echa un vistazo a los documentos :
fuente
Java
Equivalente a Kotlin:
fuente
TAREA :
Consideremos el siguiente ejemplo:
Necesitamos el siguiente equivalente en Kotlin:
SOLUCIONES :
1.a . Puedes usar
if-expression
en Kotlin:1.b . Puede ser mucho mejor si cambias esto
if-expression
(hagámoslo sinnot
):2 . El operador de Kotlin en Elvis
?:
puede hacer un trabajo aún mejor:3 . O use un
Extension function
para laAnswer
clase correspondiente :4 . Usando el
Extension function
puede reducir un código gracias aElvis operator
:5 . O simplemente use el
when
operador:Espero que esto ayude.
fuente
cuando reemplaza el operador de cambio de lenguajes tipo C. En la forma más simple se ve así
fuente
when
como una declaración, no una expresión. Una comparación más relevante con las expresiones condicionales ternarias sería hacer que cada rama devuelva un valor, de modo que la expresión completa cuando se evalúe como un valor (como sucede con los condicionales ternarios).No hay operador ternario en Kotlin. Parece problemático a primera vista. Pero piense que podemos hacerlo con la instrucción inline if else porque esta es la expresión aquí. Simplemente tenemos que hacer -
Aquí podemos hacerlo si bloqueamos tantos como necesitemos. Me gusta-
Entonces, esta línea es tan simple y mucho más legible que el operador ternario. Cuando utilizamos más de un operador ternario en Java, parece horrible. Pero aquí tenemos una sintaxis clara. incluso podemos escribirlo en varias líneas también.
fuente
Puede usar
var a= if (a) b else c
en lugar del operador ternario.Otro buen concepto de kotlin es el operador de Elvis. No necesita marcar nulo cada vez.
Esto devolverá la longitud si b no es nulo; de lo contrario, se ejecuta la declaración del lado derecho.
fuente
como Drew Noakes citó, kotlin usa if enunciado como expresión, por lo que el Operador condicional ternario ya no es necesario,
pero con la función de extensión y la sobrecarga de infijo, puede implementarlo usted mismo, aquí hay un ejemplo
entonces úsalo así
fuente
Otro enfoque interesante sería usar
when
:Puede ser bastante útil en algunos escenarios más complejos. Y honestamente, es más legible para mí que
if ... else ...
fuente
Puedes hacerlo de muchas maneras en Kotlin
Usando if
Usando cuando
Seguridad nula
fuente
No hay una operación ternaria en Kotlin, pero hay algunas formas divertidas de solucionarlo. Como otros han señalado, una traducción directa a Kotlin se vería así:
Pero, personalmente, creo que eso puede ser un poco abarrotado y difícil de leer. Hay algunas otras opciones integradas en la biblioteca. Puede usar takeIf {} con un operador de elvis:
Lo que sucede allí es que el comando takeIf {} devuelve su resultado1 o nulo, y el operador elvis maneja la opción nula. Hay algunas opciones adicionales, takeUnless {}, por ejemplo:
El lenguaje es claro, ya sabes lo que está haciendo.
Si es una condición de uso común, también podría hacer algo divertido como usar un método de extensión en línea. Supongamos que queremos rastrear un puntaje de juego como Int, por ejemplo, y queremos devolver siempre 0 si no se cumple una condición determinada:
Ok, eso parece feo. Pero considere cómo se ve cuando se usa:
Como puede ver, Kotlin ofrece mucha flexibilidad en cómo elige expresar su código. Hay innumerables variaciones de mis ejemplos y probablemente formas que aún no he descubierto. ¡Espero que esto ayude!
fuente
takeIf
Es mi opción favorita de hecho, muy elegante.Recuerde que el operador ternario y el operador de Elvis tienen significados separados en Kotlin a diferencia de muchos idiomas populares. Hacerlo
expression? value1: value2
te daría malas palabras por el compilador de Kotlin , a diferencia de cualquier otro idioma, ya que no hay un operador ternario en Kotlin como se menciona en los documentos oficiales . La razón es que las propias declaraciones if, when y try-catch devuelven valores.Entonces, hacer
expression? value1: value2
puede ser reemplazado porEl operador de Elvis que tiene Kotlin , funciona solo en el caso de variables anulables, p. Ej .:
Se puede lograr una comprensión más clara de estas respuestas .
fuente
Puede usar la
if
expresión para esto en Kotlin. En Kotlinif
hay una expresión con un valor de resultado. Entonces en Kotlin podemos escribiry en Java podemos lograr lo mismo pero con un código más grande
fuente
Si no sabe qué usar la notación estándar, también puede crearla / simularla usando infijo con algo como esto:
crea una clase para mantener tu objetivo y resultado:
crear algunas funciones de infijo para simular una operación ternaria
Entonces podrás usarlo así:
fuente
Otro enfoque corto para usar
Aquí kotlin comprueba el valor nulo y, si es nulo, pasa un valor de cadena vacío.
fuente
¿Por qué uno usaría algo como esto:
cuando realmente puedes usar algo como esto (
a
es booleano en este caso):fuente
? and :
contradice la declaración de tipo nulo / nulo en lugar de una verificación de tipo. Aparte de eso, no veo ninguna razón. Creo que alguien definitivamente habría pensado un poco, si hay una verificación en línea de la condición if-else. Esperemos y veamos en futuras versiones.Cuando trabaje con apply (), deje que parezca muy útil cuando se trata de operaciones ternarias, ya que es más elegante y le da espacio
fuente
Con las siguientes funciones de infijo puedo cubrir muchos casos de uso comunes de la misma manera que se puede hacer en Python:
fuente
No hay operador ternario en Kotlin, los más cerrados son los dos casos siguientes,
Documentos de referencia
fuente
En kotlin si está usando ?: Funcionará como si la declaración devuelva nulo, entonces ?: 0 tomará 0 o lo que sea que tenga escrito en este lado.
fuente
En Kotlin puedes usar operaciones ternarias como esta:
val x = if(a) "add b" else "add c"
fuente
Después de investigar algunas otras ideas, he derivado el siguiente operador ternario:
Ejemplo (ejecutar aquí ):
Esta versión es fluida y no entra en conflicto con el operador de fusión nulo.
fuente
then
lugar deyes
.