Control de flujo de Java: declaraciones if y if-else

    Introducci贸n

    Las declaraciones condicionales y los bucles son una herramienta muy importante en la programaci贸n. No hay muchas cosas que podamos hacer con c贸digo que solo se pueda ejecutar l铆nea por l铆nea incondicionalmente.

    Eso es lo que significa “control de flujo”: guiar la ejecuci贸n de nuestro programa, en lugar de dejar que se ejecute l铆nea por l铆nea independientemente de cualquier factor interno o externo. Cada lenguaje de programaci贸n admite alguna forma de control de flujo, si no expl铆citamente a trav茅s de ifsy fors, o declaraciones similares, entonces impl铆citamente nos da las herramientas para crear tales construcciones, es decir, los lenguajes de programaci贸n de bajo nivel generalmente logran ese efecto con una gran cantidad de go-to comandos.

    Los bucles eran un concepto que se usaba mucho antes de que la programaci贸n de computadoras existiera, pero la primera persona en usar un bucle de software fue Ada Lovelace, com煤nmente conocida por su apellido de soltera, Byron, mientras calculaba N煤meros de Bernoulli, all谩 por el siglo XIX.

    go-to Los comandos deben evitarse en la mayor铆a de las situaciones, siempre que usemos un lenguaje de programaci贸n que nos brinde las herramientas para evitarlo, como lo hacen Java y todos los lenguajes similares de forma remota (hay una peque帽a excepci贸n a esta regla al romper bucles anidados).

    En Java, hay varias formas de controlar el flujo del c贸digo:

    • if y if-else declaraciones
    • cambiar declaraciones
    • while y do-while declaraciones
    • for y enhanced for declaraciones
    • break y continue declaraciones

    La declaraci贸n if

    los if La declaraci贸n es probablemente la forma m谩s com煤n de control de flujo, independientemente del idioma. Es muy simple e intuitivo:

    if (true) {
        // Execute this code block if the argument/expression is true
    }
    

    Dado que en muchos casos, solo se debe ejecutar una sola l铆nea de c贸digo, puede omitir el uso de las llaves y simplemente sangrar la siguiente l铆nea, aunque esto solo funciona para una sola l铆nea:

    if (true)
        System.out.println("Inside the if block");
        System.out.println("I have nothing to do with the if block!");
    System.out.println("Neither do I!");
    

    Por lo general, no ingresamos directamente boolean valores como condicionales, como en estos ejemplos, sino que usamos una expresi贸n:

    if (username != null)
        System.out.println(username);
    if (argument >= 10)
        System.out.println("The input is higher or equal than 10");
    

    Si la expresion es false, el c贸digo perteneciente al if declaraci贸n simplemente se omite:

    if (1 > 5)
        System.out.println("Hello");
    System.out.println(" World!");
    

    Y la salida es:

     World!
    

    La declaraci贸n if-else

    Muchas veces no querr谩 simplemente omitir un fragmento de c贸digo si la expresi贸n se eval煤a como false. Normalmente, queremos hacer algo else en ese caso:

    if (expression) {
        // Code that executes only if the expression is true
    }
    else { // Optional
        // Code that executes only if the expression is false
    }
    

    Por supuesto, puede utilizar el else declaraci贸n junto con la abreviatura if declaraci贸n:

    if (expression)
        // Code that executes only if the expression is true
    else
        // Code that executes only if the expression is false
    

    Sin embargo, esto no es recomendable si no est谩 tratando con declaraciones simples, especialmente con anidadas. ifs ya que es dif铆cil averiguar “cu谩l if hace un particular else pertenecen a “. El uso de corchetes eliminar谩 la ambig眉edad del problema si encuentra este enfoque ilegible.

    los else declaraci贸n de declaraci贸n es opcional, por lo que no es necesario escribir un vac铆o else {} bloquear si no queremos que pase nada si es el expression Es falso.

    los else declaraci贸n est谩 intr铆nsecamente ligada a la if declaraci贸n y no puede existir sin ella. Eso debe aparecer justo despu茅s del if de lo contrario, aparecer谩 un error del compilador “else without if”.

    En muchos casos, queremos comparar algo para la igualdad, si una variable tiene el mismo valor que otra o si es m谩s peque帽a o m谩s grande que otra. Por ejemplo:

    String s = "smol";
    
    if (s.length() > 8)
        System.out.println("Variable s has too many characters!");
    else
        System.out.println("Ok, so basically, s is very " + s);
    

    los > operador aqu铆 tiene el significado habitual “mayor que”, y Java admite el grupo habitual de operadores relacionales. 脡stas incluyen <, >, <=, =>, == verifica la igualdad y != comprueba la desigualdad.

    Nota: Aseg煤rate de usar == en if declaraciones en lugar de =o bien puede asignar un valor en lugar de compararlo.

    2 < 5   // true
    2 < 2   // false
    2 <= 2  // true
    2 == 3  // false
    2 != 3  // true
    

    Nota: La mayor parte del tiempo, no comparamos String variables usando == pero con el .equals() m茅todo. == comprueba la igualdad de referencia del objeto. Para tipos primitivos (int, char, etc.) es lo mismo que comprobar si tienen el mismo valor, pero con Strings lo m谩s com煤n es que no lo sea.

    if (string1.equals(string2))
        // Code to be executed if the strings are equal by value
    

    Declaraciones if anidadas

    Podemos tener mas de uno if declaraci贸n conectada, ya sea anidando (poniendo una if declaraci贸n dentro de otra) o agregando una else if al final de nuestro anterior if:

    int ourNumber = 10;
    
    if (ourNumber > 8) {
        if (ourNumber % 2 == 0) {
           System.out.println("The number is larger than 8 and even");
        }
    }
    else if (ourNumber == 1) {
        System.out.println("1 is less than 8, so the previous if block isn't executed");
    }
    else {
        System.out.println("ourNumber is less than 8 and different than 1");
    }
    

    los else los bloques siempre “pertenecen” a la if del mismo nivel, por lo que else if (ourNumber == 1) en nuestro c贸digo pertenece al if (ourNumber > 8) y no el anidado if que comprueba si el n煤mero es par.

    Puedes tener tantos else if bloques como quieras, pero solo uno else bloque, que debe ser el 煤ltimo. Solo el primero de los if, else if y else bloques que se eval煤an como verdadero ejecutar谩n su c贸digo:

    if (expression)
        // If expression is true, execute
    else if (expression2)
        // If expression2 is true, execute
    else if (expression3)
        // If expression3 is true, execute
    ...
    else (expression4)
        // If expression4 is true, execute
    

    Varias expresiones en una sola declaraci贸n if

    Otra cosa muy 煤til es la capacidad de verificar m煤ltiples condiciones en una sola if:

    int ourNumber = 10;
    
    if (ourNumber > 5 && (ourNumber % 2 == 0)) {
        System.out.println("The number is larger than 8 and even");
    }
    

    los && El operador es uno de los operadores logicos Soporta Java. En los siguientes ejemplos boolExpr se usa como abreviatura de boolean expression. Recordatorio: a boolean expresi贸n es una expresi贸n que se puede evaluar como true o false, es decir, tambi茅n puede ser una expresi贸n que contenga un operador l贸gico, como podemos ver aqu铆:

    • !boolExpr: ! es negaci贸n, eval煤a un true expresi贸n a false y viceversa.
    • boolExpr1 & boolExpr2: la Y operador eval煤a a true si ambas expresiones son true.
    • boolExpr1 | boolExpr2: la O operador eval煤a a true si al menos una de las expresiones es true.
    • boolExpr1 && boolExpr2: el cortocircuito Y operador eval煤a a true s贸lo si boolExpr1 y boolExpr2 son ambos true. Se llama operador de cortocircuito porque si la primera expresi贸n es false, ni siquiera evaluar谩 la segunda expresi贸n como la condici贸n b谩sica de que ambos deben ser true nunca puede ocurrir. Con expresiones simples, esto no afecta el c贸digo de manera significativa, pero en el c贸digo de producci贸n, ambas expresiones pueden ser operaciones costosas y este enfoque puede optimizar significativamente el c贸digo.
    • boolExpr1 || boolExpr2: el cortocircuito O operador eval煤a a true si al menos uno de boolExpr1 y boolExpr2 es true. Una versi贸n de cortocircuito del | operador.
    • boolExpr1 ^ boolExpr2: la XOR operador eval煤a a true s贸lo si boolExpr1 y boolExpr2 se eval煤an de manera diferente, es decir, si solo uno de ellos es true y el otro es false.
    true && false // false
    (2 < 5) && (2 != 3) // true
    false || true //true
    true && ((false || false) ^ true) // true
    (true && false) || false // false
    

    Es muy recomendable usar par茅ntesis siempre que tenga sentido usarlos. El 煤ltimo ejemplo funciona igual sin par茅ntesis, pero confiando en precedencia del operador es extremadamente arriesgado y conduce a un c贸digo ilegible.

    Construcciones ternarias

    El 煤nico operador ternario (un operador que toma tres operandos) en Java se compone de la ? y : operadores. Funciona como un muy compacto if-else declaraci贸n.

    // The if-statement below...
    int max = 0;
    if (a > b)
        max = a;
    else max = b;
    
    // ...can be written as:
    int max = (a > b) ? a : b;
    

    As铆 es como se ve generalmente una construcci贸n ternaria:

    (expression) ? returnValueIfTrue : returnValueIfFalse
    

    Las construcciones ternarias tambi茅n pueden funcionar sin par茅ntesis, aunque generalmente es m谩s legible usar par茅ntesis:

    int max = a > b ? a : b;
    

    Tambi茅n puede utilizar construcciones ternarias para modificar variables:

    System.out.println("10% discount for orders above $50!");
    double orderPrice = 55;
    double finalPrice = orderPrice > 50 ? orderPrice*0.9 : orderPrice;
    System.out.println("Your final price is $" + finalPrice);
    

    Y la salida es:

    Your final price is $49.5
    

    Usando la construcci贸n, tambi茅n podemos llamar a m茅todos:

    public void someMethod() {
        String userRole = "Admin";
        String result = userRole.equals("Admin") ? greetAdmin() : greetUser();
        System.out.println(result);
    }
    
    static String greetAdmin() {
        return "Hello Admin!";
    }
    
    static String greetUser() {
        return "Hello User!";
    }
    

    L贸gicamente, esto resultar铆a en:

    Hello Admin!
    

    Construcciones ternarias anidadas

    System.out.println("10% discount for all orders above $50 and additional $5 off if your order exceeds 2 items!");
    double orderPrice = 140;
    int quantity = 5;
    double finalPrice = (orderPrice > 50) ? (quantity > 2) ? (orderPrice*0.9)-5 : orderPrice*0.9 : orderPrice;
    System.out.println("Your final price is: $" + finalPrice);
    

    Dado que ambas condiciones son true, la salida es:

    10% discount for all orders above $50 and additional $5 off if your order exceeds 2 items!
    Your final price is: $121.0
    

    Sin embargo, este enfoque es terriblemente ilegible. Si es posible, evite anidar construcciones ternarias, aunque si es necesario, div铆dalo en bloques m谩s simples con nuevas l铆neas y sangr铆a. Por ejemplo, este ejemplo se puede hacer un poco m谩s legible:

    System.out.println("10% discount for all orders above $50 and additional $5 off if your order exceeds 2 items!");
    double orderPrice = 140;
    int quantity = 5;
    double finalPrice = (orderPrice > 50) ?
                            (quantity > 2) ?
                                    (orderPrice*0.9)-5 : orderPrice*0.9
                        : orderPrice;
    System.out.println("Your final price is: $" + finalPrice);
    

    Conclusi贸n

    El control de flujo en el c贸digo es esencial para absolutamente todas las aplicaciones. Declaraciones como if y if-else son bloques de construcci贸n fundamentales y todo desarrollador aspirante debe tener el control total / ser consciente de c贸mo funcionan.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *