Vanesa Percy
💚💯😅😅😅
Cristian David Restrepo Marin
jajajajaja
Salvador Isaias Dueñas Urrutia
este lenguaje entre mas lo veo mas lo amo
Cuando trabajas con tipos nullable en Kotlin, es común necesitar un plan B para evitar errores por valores nulos. El operador Elvis es precisamente esa herramienta que te permite asignar un valor por defecto cuando una expresión devuelve null, convirtiendo así un tipo nullable en uno no nullable de forma limpia y concisa.
¿Qué problema resuelve el operador Elvis en Kotlin?
En Kotlin, los tipos nullable permiten que una variable contenga null. Sin embargo, al querer asignar el resultado de una operación sobre un nullable a una variable de tipo no nullable, el compilador marca un error. Esto ocurre porque no puedes asignar un tipo nullable a uno que no lo es directamente.
Por ejemplo, si tienes una variable nombre de tipo String? (que puede ser nula) y quieres obtener la cantidad de caracteres con .length, el resultado será de tipo Int?. Intentar guardar ese valor en una variable Int sin manejar la nulidad provocará un error de compilación [01:10].
¿Cómo se utiliza el operador Elvis con la sintaxis ?:?
El operador Elvis se escribe con el símbolo ?: (signo de interrogación seguido de dos puntos). Se llama así porque visualmente el símbolo se asemeja al copete del cantante americano Elvis Presley [02:00].
La mecánica es sencilla:
null.kotlin val nombre: String? = null val caractresDeNombre: Int = nombre?.length ?: 0 println(caractresDeNombre)
En este ejemplo, nombre?.length devuelve null porque nombre es nulo. Gracias al operador Elvis, en lugar de propagar ese null, se asigna 0 como valor por defecto [02:30].
¿Qué sucede al ejecutar el código?
Al correr el programa, la salida es 0. Esto confirma que:
nombre es null..length, el resultado es null.null y devuelve el valor 0 definido a la derecha.De esta forma, la variable caractresDeNombre siempre tendrá un valor válido de tipo Int, nunca será nula.
¿Por qué es útil convertir de nullable a no nullable?
Esta conversión es fundamental en Kotlin por varias razones:
NullPointerException en tiempo de ejecución.El operador Elvis complementa otras herramientas de manejo de nulabilidad como los safe calls (?.) y el bloque try-catch. Mientras que los safe calls permiten acceder a propiedades de forma segura y try-catch captura excepciones, el operador Elvis se enfoca en proveer un valor alternativo de manera directa y expresiva.
Si ya manejas safe calls en tu código Kotlin, agregar el operador Elvis te permitirá escribir lógica más robusta con menos líneas. ¿Has encontrado algún caso donde prefieras usar try-catch en lugar del operador Elvis? Comparte tu experiencia.
Vanesa Percy
💚💯😅😅😅
Cristian David Restrepo Marin
jajajajaja
Salvador Isaias Dueñas Urrutia
este lenguaje entre mas lo veo mas lo amo
Algunos datos adicionales para Elvis Operator:
++Kotlin Version++
fun decompileTest(person: Person?) { val name = person?.name ?: "raul" val age = person?.age ?: throw IllegalArgumentException("raul is null") }
++Decompile Version++
public static final void decompileTest(@Nullable Person person) { if (person == null || person.getName() == null) { String var10000 = "raul"; } if (person != null) { int var2 = person.getAge(); } else { throw (Throwable)(new IllegalArgumentException("raul is null")); } }
Este ejemplo lo dejó mucho más claro para mí:
println("Practicando operador Elvis") val m: String? = null val l: Int = if (m != null) m.length else -1 println(l) //Con el operador Elvis expresamos // lo mismo que en la línea anterior val c = m?.length ?: -1 println(c)
Si la expresión a la izquierda de ?: no es nula, el operador Elvis la devuelve; de lo contrario, devuelve la expresión a la derecha. Tenga en cuenta que la expresión del lado derecho se evalúa sólo si el lado izquierdo es nulo.
Laura Roa
El Elvis operator ?: Es una versión segura de una expresión if. Devuelve el valor a su izquierda si no es nulo. De lo contrario, devuelve el valor a su derecha.. por ejemplo:
w?.play ?: -1
El Elvis operator primero verifica el valor a su izquierda, en este caso w?.play y si ese valor no es null, el Elvis operator lo retorna. En el caso de que el valor de la izquierda sea null, el Elvis operator retornara el valor de la derecha, en este caso -1
es como decir "si w no es nulo y su propiedad de play no es nula, devuelve el valor de la propiedad de play, de lo contrario, devuelve -1
Pueden encontrar mas información sobre este tema en el libro que les recomende anteriormente Head First Kotlin!
Kevin Vega
Muchas Gracias :), la mejor explicación que he podido encontrar
Silvana Rolón
JOSE EMMANUEL RAMIREZ GUERRERO
Entonces este operador vendría siendo como ternario reducido de Java, donde se tenía:
int caracteresDelNombre = ( nombre != null) ? nombre.length : 0;
o en JS el operador ||, donde lo usamos como:
const caracteresDelNombre = nombre?.length || 0
Cristian David Restrepo Marin
v
Diego Geovanny Bracero
?:v
Alejandra Morataya
Se puede decir que es equivalente al operador ternario de java?
Carlos Fernando Aguilar González
Hola Alejandra
Buena pregunta y a la vez es una buena observación. Creo que la lógica con la que funcionan es bastante similar aunque no sé si sean equivalentes.
Saludos
Alvaro Huaysara Jauregui
?: es equivalente al ?? de Javascript ?
Elvis Muñoz
No me esperaba esto de Kotlin :)
Emanuel Agustín Serdeiro
Un pequeño codigo para repasar
fun main() { println("Diga un nombre ") var nombre : String? = readLine().toString() var largonombre : Int = nombre?.length ?: 0 when(largonombre){ 0 -> println("Error, complete el formulario") else -> println("El largo del nombre es de $largonombre letras") } }
Vanesa Percy
Hola tengo la siguiente duda ¿por qué cuando declara las variables de tipo nullable, las define como de lectura y escritura; es decir con la palabra reservada var y no con val?
¿Esto afecta en algo el funcionamiento del operador Elvis?
Vanesa Percy
Me respondo a mí misma, se pone de tipo var para que después la variable pueda cambiar de un tipo nullable a uno no nullable, la variable podrá mutar; mientras que si la declarase como tipo val no podría mutar o cambiar de un tipo a otro. 💚💯😅😅😅
Vanesa Percy
Hugo Ponce
Porque dice que la segunda variable es no nulable??
Gonzalo Yoel Rivero
Si te referis a la variable caracteresDeNombre, la misma no es nulable ya que por defecto las variables en Kotlin son no nulables(No pueden tener valor null). En el caso de la primer variable, nombre, esta explicitado que la misma es nulable(Puede tener valor null). Esto se realiza agregando el signo de interrogacion al final del tipo de dato de la variable
En el caso de la primer variable es String? (Tiene signo de interrogacion, por ende es nulable) En el caso de la segunda variable es Int (No tiene signo de interrogacion, por ende es no nulable)
Hely Andrés Palencia
En otros lenguajes se llama operador ternario
Valeria Maqueda
OPERADOR ELVIS var nombre; String? = null val caracteresDeNombre : Int = nombre?.lenght ?: 0 println(caracteresDeNombre) }
Lo convierte en no nullable
Alan Díaz Díaz
++OPERADOR ELVIS++
En Kotlin, podemos declarar una variable que puede contener null reference. Supongamos que tenemos una referencia anulable a, podemos decir "si ano es nulo, utilícelo, de lo contrario use algún valor no nulo x"
var a: String? = "Nullable String Value"
Ahora, apuede ser nulo. Entonces, cuando necesitamos acceder al valor de a, debemos realizar una verificación de seguridad, ya sea que contenga valor o no. Podemos realizar esta verificación de seguridad mediante una if...elsedeclaración convencional .
val b: Int = if (a != null) a.length else -1
Pero aquí viene el operador avanzado Elvis(Operador Elvis :) ?:. Lo anterior if...elsese puede expresar con el operador de Elvis de la siguiente manera:
val b = a?.length ?: -1
Si la expresión a la izquierda de ?:(aquí a?.length:) no es nula, el operador elvis la devuelve; de lo contrario, devuelve la expresión a la derecha (aquí:) -1. La expresión del lado derecho se evalúa solo si el lado izquierdo es nulo.
Alejandro Ivan Mendieta
El curso está bien, pero... no veo nada , tengo que ponerlo en pantalla completa para ver bien el código.
David Galicia Gomez
Esto en cierta forma me recordo al operador ternario, claro aun que al parecer elvis solo comprueba null
Cristian David Restrepo Marin
var nomb: String? = null var caracteresDenomb : Int = nomb?.length ?: 0 println(caracteresDenomb)
Raul Padilla Gutierrez
Que excelente ese operador elvis!!!!!
Aunque en la práctica ya sea que se utilice var (lectura y escritura) o val (sólo lectura) parece no afectar en nada el funcionamiento del operador Elvis. Aquí la prueba:
println("Prueba con tipo var") var nombre: String? = null val caracteresDeNombre: Int = nombre?.length ?: 0 println(caracteresDeNombre) println("Prueba con tipo val") val profesion: String? = null val longitudProfesion: Int = profesion?.length ?: -1 println(longitudProfesion)
Realmente no puedo concluir en qué radica que el profe declara esa variable de tipo var y no val.