Operador condicional terciario de Kotlin

¿Cuál es el equivalente de esta expresión en Kotlin?

a ? b : c 

Este no es un código válido en Kotlin.

En Kotlin, if declaraciones son expresiones. Entonces el siguiente código es equivalente:

 if (a) b else c 

Podría definir su propia Boolean extensión Boolean que devuelve null cuando Boolean es false para proporcionar una estructura similar al operador ternario:

 infix fun <T> Boolean.then(param: T): T? = if (this) param else null 

Esto haría un a ? b : c a ? b : c expresión se traduce a a then b ?: c , así:

 println(condition then "yes" ?: "no") 

Actualización: Pero para hacer un cambio condicional similar a Java necesitarás algo así

infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null

println(condition then { "yes" } ?: "no") preste atención en la lambda. su cálculo de contenido debe posponerse hasta que nos aseguremos de que la condition sea true

Este parece torpe, es por eso que existe una gran demanda de que exista un operador ternario de Java en Kotlin

Para mí, uso las siguientes funciones de extensión:

 fun T?.or<T>(default: T): T = if (this == null) default else this fun T?.or<T>(compute: () -> T): T = if (this == null) compute() else this 

El primero devolverá el valor pnetworkingeterminado proporcionado en caso de que el object sea nulo. El segundo evaluará la expresión proporcionada en lambda en el mismo caso.

Uso:

 1) e?.getMessage().or("unknown") 2) obj?.lastMessage?.timestamp.or { Date() } 

Personalmente, para mí, el código anterior es más legible que if construcción en línea

En Kotlin, if es una expresión, es decir, devuelve un valor. Por lo tanto, no hay operador ternario (condition ? then : else) , porque ordinario si funciona bien en este rol. fuente manual desde aquí

 // Traditional usage var max = a if (a < b) max = b // With else var max: Int if (a > b) { max = a } else { max = b } // As expression val max = if (a > b) a else b 

Eche un vistazo a los documentos :

En Kotlin, si es una expresión, es decir, devuelve un valor. Por lo tanto, no hay operador ternario (condición? Entonces: más), porque ordinario si funciona bien en este rol.

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 a ? b : c también se puede express así:

 b.takeIf { a } ?: c 

Esto se vuelve aún más corto en caso de que c sea null :

 b.takeIf { a } 

También tenga en count que típico en Java World null comtesting como value != null ? value : defaultValue value != null ? value : defaultValue traducir en ideomatic Kotlin a value ?: defaultValue justo value ?: defaultValue .

Similar a != null ? b : c a != null ? b : c se puede traducir a a?.let { b } ?: c .

No hay operador ternario en kotlin, ya que el bloque if else devuelve valor

entonces, usted puede hacer: val max = if (a > b) a else b lugar de java's max = (a > b) ? b : c max = (a > b) ? b : c

También podemos usar when construye, también devuelve valor:

 val max = when(a > b) { true -> a false -> b } 

aquí hay un enlace para la documentation https://kotlinlang.org/docs/reference/control-flow.html

Java

 int temp = a ? b : c; 

Equivalente a Kotlin:

 var temp = if (a) b else c 

cuando reemplaza el operador de cambio de lenguajes tipo C. En la forma más simple, parece que esto

 when (x) { 1 -> print("x == 1") 2 -> print("x == 2") else -> { print("x is neither 1 nor 2") } } 

No hay operador ternario en Kotlin. Parece problemático a primera vista. Pero piense que podemos hacerlo con una instrucción inline if else porque esta es la expresión aquí. Simplemente tenemos que hacer –

 var number = if(n>0) "Positive" else "Negetive" 

Aquí podemos más si bloqueamos tantas como necesitemos. Me gusta-

 var number = if(n>0) "Positive" else if(n<0) "Negative" else "Zero" 

Entonces esta línea es tan simple y muy legible que el operador ternario. cuando usamos más de un operador ternario en java parece horrible. Pero aquí tenemos una syntax clara. incluso podemos escribirlo en múltiples líneas también.

como Drew Noakes citó, kotlin usa la expresión if como expresión, por lo que Ternary Conditional Operator ya no es necesario,

pero con la function de extensión y la sobrecarga infija, puede implementarlo usted mismo, aquí hay un ejemplo

 infix fun <T> Boolean.then(value: T?) = TernaryExpression(this, value) class TernaryExpression<out T>(val flag: Boolean, val truly: T?) { infix fun <T> or(falsy: T?) = if (flag) truly else falsy } 

luego úsalo así

 val grade = 90 val clazz = (grade > 80) then "A" or "B" 

Otro enfoque interesante sería usar when :

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

Puede ser bastante útil en algunos escenarios más complejos. Y, sinceramente, es más fácil de leer para mí que if ... else ...

Puedes hacerlo de muchas maneras en Kotlin

  1. Usando si

     if(a) b else c 
  2. Usando cuando

     when (a) { true -> print("value b") false -> print("value c") else -> { print("default return in any other case") } } 
  3. Seguridad nula

     val a = b ?: c 

Declaraciones -> Expresiones

En Kotlin, muchas declaraciones que incluyen if , when o incluso try pueden usarse como expresiones . Esto significa que tiene un resultado y puede asignarse a una variable, devuelta desde una function, etc.

No hay necesidad de operador ternario

Habiendo dicho eso, Kotlin no necesita el operador ternario .

if (a) b else c es lo que puede usar en lugar de la expresión Java a ? b : c a ? b : c .

OMI , este último es less legible ya que todos saben lo que hace ifelse , mientras que ? : ? : es bastante inconveniente. Así que estoy de acuerdo en que un operador ternario no tiene derecho a existir en Kotlin.

Otras alternativas

cuando

También puede ver mucho when construye cuando las condiciones se verifican en Kotlin. También es una forma de express cascadas if-else de una manera alternativa. Lo siguiente corresponde a tu ejemplo.

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

Extensiones

Como muestran muchos buenos ejemplos ( https://stackoverflow.com/a/39687177/8073652 ) en las otras respuestas, las extensiones también pueden ser un path por recorrer.

Otro enfoque breve para usar

 val value : String = "Kotlin" value ?: "" 

Aquí, kotlin comtesting el valor nulo y si es nulo, pasa el valor de cadena vacía.

Con las siguientes funciones de infijo, puedo cubrir muchos casos de uso común de forma muy parecida a como se puede hacer en Python:

 class TestKotlinTernaryConditionalOperator { @Test fun testAndOrInfixFunctions() { Assertions.assertThat(true and "yes" or "no").isEqualTo("yes") Assertions.assertThat(false and "yes" or "no").isEqualTo("no") Assertions.assertThat("A" and "yes" or "no").isEqualTo("yes") Assertions.assertThat("" and "yes" or "no").isEqualTo("no") Assertions.assertThat(1 and "yes" or "no").isEqualTo("yes") Assertions.assertThat(0 and "yes" or "no").isEqualTo("no") Assertions.assertThat(Date() and "yes" or "no").isEqualTo("yes") @Suppress("CAST_NEVER_SUCCEEDS") Assertions.assertThat(null as Date? and "yes" or "no").isEqualTo("no") } } infix fun <E> Boolean?.and(other: E?): E? = if (this == true) other else null infix fun <E> CharSequence?.and(other: E?): E? = if (!(this ?: "").isEmpty()) other else null infix fun <E> Number?.and(other: E?): E? = if (this?.toInt() ?: 0 != 0) other else null infix fun <E> Any?.and(other: E?): E? = if (this != null) other else null infix fun <E> E?.or(other: E?): E? = this ?: other 

En Kotlin, no hay un operador ternario .

En Kotlin, si es una expresión, es decir, devuelve un valor.

Por lo tanto, no hay operador ternario (condición? Entonces: más), porque ordinario si funciona bien en este rol.

Equivalente en Kotlin

 var a = if (a) b else c 

Documento de reference : https://kotlinlang.org/docs/reference/control-flow.html