Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Estructuras de Control: when

14/37
Recursos

Aportes 25

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Mi ejemplo usando un input
![](

Mi intento de una calculadora muy básica

ESTRUCTURA DE CONTROL WHEN

Esta sentencia sirve en los casos que tengamos que comparar nuestra variable con múltiples opciones, ya que con la sentencia IF puede resultar poco optimo. 

SINTAXIS WHEN

🔶 Iniciamos con la palabra reservada WHEN.
🔶 Entre parentesis () escribimos la variable o constante que queremos evaluar.
🔶 Posteriormente, vamos abrir y cerrar llaves {}, dentro de estas escribiremos las diferentes condiciones o casos.
🔶 Cada vez que creamos un condición deberemos escribir un guion y un mayor que (->), luego entre llaves {} colocaremos el bloque de codigo que se va a ejecutar, para ello se escribe println(“el mensaje que va a salir por consola”).
🔶 Por ultimo, utilizaremos ELSE para definir un bloque de codigo en caso que ninguna de nuestras opciones coincidan con el valor de nuestra variable.

EJEMPLO CON STRING

<EJEMPLO:

        val pais = "Argentina"

        when(pais) {
            "Argentina" -> {
                println("El idioma de ${pais} es Español");
            } "Alemania" -> {
                println("El idioma de ${pais} es Aleman");
            } "EEUU" -> {
                println("El idioma de ${pais} es Ingles");
            } "Brasil" -> {
                println("El idioma de ${pais} es Portugues");
            } else -> {
                println("No conocemos el idioma");
            }
        } > 
Si tenemos varios casos que coinciden con el mismo valor, lo podremos unir en una única condición colocando una coma(,) al final de cada condición.   

Al trabajar con when y números enteros (Int) podremos usar rangos, para ello debemos:  

🔶 Se utiliza la misma sintaxis.
🔶 En los casos o condiciones utilizaremos la palabra reservada IN.
🔶 Seguido del valor inicial.
🔶 Luego escribir dos puntos (…) y
🔶Por ultimo, colocamos el valor en donde se quiere que termine nuestro rango.

EJEMPLO CON NUMEROS ENTEROS

<val edad = 33;

        when(edad) {
            in 0..3 -> {
                println("Tu edad es ${edad} eres un bebe");
            } in 4..11 -> {
                println("Tu edad es ${edad} eres un niño");
            } in 12..18 -> {
                println("Tu edad es ${edad} eres un adolecente");
            } in 19..59 -> {
                println("Tu edad es ${edad} eres un adulto");
            } in 60..99 -> {
                println("Tu edad es ${edad} eres un adulto mayor");
            } else -> {
                println("😲");
            }
        }> 

When también se puede tilizar sin parametro y usarlo como condiciones if-else.

Es como un Switch case C++

Creo que me está empezando a gustar este lenguaje

En este curso si que estoy entendiendo, y principalmente me está llamado muchísimo la atención. Como que le estoy agarrando amor a Kotlin ❤️

Aqui un pequeño ejemplo de un programa que calcula la calificacion en letras en base a un numero:



Les dejo un fragmento de código para usar en el mundo real (cambiar como se muestran los miles y los millones en las redes sociales)

  val mensaje = when(val code = 12000000){
        in 1000..999999 -> (code/1000).toString()+"k likes"
        in 1000000..POSITIVE_INFINITY.toInt() -> (code/1000000).toString()+"m likes"
        else -> "Muy pocos likes 😔"
  }

  println(mensaje)

Es como un switch de Java mejorado

otra forma de usar el when es sin la variable, por ejemplo…

when  ("Rojo") {
        "Amarillo" -> println("EL amarillo es amarillo como el sol")
        "Rojo" -> println("El rojo es tan rojo como el rojo pasion")
        "Morado","Purpura" -> println("El morado es el mejor color del mundo yei")
        else -> println("Error, ponle color")

    }

Para los que vienen de java, no los hace acordar al if, if else, else?

para definir un rango en kotlin se usan 2 puntos, ejemplo in 200…300

<println("Hello World!")
    //Var es para variable que puede modificar valor y val para los que no
    var a = 5
    var cadena1 = "Hola"
    var cadena2 = "mundo"

    //prueba de if
    if(a==5){
        println("asi funciona if")
        println(cadena1+cadena2)
    }
    
    //prueba de un switch en kotlin
    println("Dame una opcion")
    var opc= readLine().toString().toInt()

    println("La opc es: $opc")

    when(opc){
        1->{
            println("Seleccionaste 1")
        }
        2->{
            println("Seleccionaste 2")
        }
        3->{
            println("Seleccionaste 3")
        }
        else->{
            println("Selecciona una opcion del 1 al 3")
        }


    }> 

Otro ejemplo

 println("Ingresa un nombre de usuario ")
    val username = readLine()?.lowercase()
    when(username){
        "emanuel" -> println("el username $username es correcto ")
        "agustin" -> println("el el username $username es correcto")
        else -> println("El username es invalido")
    }
val code = 200
    when(code){
        in 200..299 -> println("Todo ha ido bien")
        in 400..500 -> println("Algo ha fallado")
        else -> println("Codigo desconocido, algo ha fallado")
    }

    val tallaDeCalzado = 45
    val menssage = when(tallaDeCalzado){
        41,43 -> "Tenemos disponibile"
        42,44 -> "Quedan pocas unidades"
        45 -> "No hay disponibile"
        else -> "Para las demas tallas no hay disponibles"
    }
    println(menssage)

Es posible combinar with y when para poder usar los métodos de la variable usada en with dentro de los clausulados del when. ejemplo

with(this.command) {
    return when {
        equals("@exclude") -> null
        startsWith("shell:") || startsWith("shell_new:") -> command.substring("shell:".length)
        else -> this.splitCommand().getGradleCommandToExecute(project)
    }
}

mi humile aporte

println("type your size shoes")
    val sizeShoes = readLine().toString().toInt()
    val mesage = when(sizeShoes){
        41,43->"is available"
        42,43->"few stocks!"
        45->"Sorry is not available"
        else -> "These shoes are only available in size 42,43,44 & 45"
    }
    println(mesage)

La expresión when
Para empezar, la puedes usar como cualquier switch básico. Imagina que por ejemplo tienes una vista y quieres mostrar un toast en función de su visibilidad.

Puedes hacer:

when(view.visibility){
    View.VISIBLE -> toast("visible")
    View.INVISIBLE -> toast("invisible")
    else -> toast("gone")
}

En la expresión when, else es lo mismo que el default del switch.

Pero when tiene algunas funcionalidad extra muy potentes:

Casting automático
Si en el lado izquierdo compruebas que la clase es de un tipo, en el lado derecho ya la tendrás casteada sin necesidad de hacer nada extra:

when (view) {
    is TextView -> toast(view.text)
    is RecyclerView -> toast("Item count = ${view.adapter.itemCount}")
    is SearchView -> toast("Current query: ${view.query}")
    else -> toast("View type not supported")
}

Además de comprobar el tipo, when puede mirar por ejemplo is un elemento está dentro de un rango o de una lista, con la palabra reservada in.

when sin argumentos
Con esta opción, podemos hacer prácticamente la comprobación que queramos.

val res = when {
    x in 1..10 -> "cheap"
    s.contains("hello") -> "it's a welcome!"
    v is ViewGroup -> "child count: ${v.getChildCount()}"
    else -> ""
}

Como when es una expresión, puede retornar un valor que se puede almacenar en una variable.

Un ejemplo aplicado a Android
Los anteriores ejemplos son muy simplones y lejos de tener utilidad real.

Pero un ejemplo que me gusta mucho es el de consumir la respuesta en un onOptionsItemSelected().

override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
    R.id.home -> consume { navigateToHome() }
    R.id.search -> consume { MenuItemCompat.expandActionView(item) }
    R.id.settings -> consume { navigateToSettings() }
    else -> super.onOptionsItemSelected(item)
}

La función consume es una función muy tonta que ejecuta la operación y devuelve true. La encuentro muy útil para los métodos del framework de Android que necesitan indicar si han consumido el resultado.

El código es muy simple:

inline fun consume(f: () -> Unit): Boolean {
    f()
    return true
}

Conclusión
Con la expresión when puedes hacer muy sencillo el código donde necesitas especificar el comportamiento en función de diferentes caminos, y donde los switch originales de Java se quedarían muy cortos.

Fuente: https://devexperto.com/expresion-when-kotlin/

Muy util sino quieres minar de condiciones el codigo es mucho mas facil de leer e interpretar, de verdad con kotlin se enfocaron mucho en simplificar el lenguaje para poder enforcarse en lo mas importante el desarrollo del software de manera rapida y sostenible.

fun main(args: Array<String>) {
	val nombreColor = "Amarillo"
	when(nombreColor){
		"Amarillo" -> println("El amarillo es el color de la alegria")
		"Rojo" -> println("El rojo simboliza el calor")
		"Verde" {
			println("Esto es un color verde")
		}
		else -> println("Error no tengo información del color")
		"Rosa", "Violeta" -> println("Esto representa estos dos colores")
	}

	val code = 200
	when(code) {
		/* cuando nuestro código esta entre 200 y 299 */
		in 200..299 -> println("Todo ha ido bien")
		in 400..500 -> println("Algo ha fallado")
		else -> println("Código desconocido algo ha fallado")
	}

	val tallaDeZapatos = 41
	val mensaje = when(tallaDeZapatos){
		41,43 -> "Tenemos disponible"
		42,44 -> "Casi no nos quedan!"
		45 -> "Lo siento no tenemos disponible"
		else -> "Estos zapatos solo vienen en talla 41, 42, 43, 44, 45"
	}

	println(mensaje)
}

Estructuras de control: WHEN
Si la condición que vamos a evaluar va a tomar un número determinado de valores que tenemos controlados a priori y para los que queremos ejecutar un código diferente podemos utilizar when en lugar de usar múltiples if else para hacer un código más legible.

when (condicion) {
    valor1 -> { }
    valor1 -> { }
    valorN -> { }
    else -> { }
}
fun main(args: Array<String>){

    val color = "Azul"

    when (color) {
        "Amarillo" -> println("El $color es el color de la alegría")
        "Rojo","Carmesí" -> println("El $color simboliza el calor")
        else -> println("Error. No tengo información del color $color")
    }
}

Esta estructura de control se parece al funcionamiento de los “switch” en otros lenguajes.