Introducci贸n
Contenido
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 if
sy for
s, 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
yif-else
declaraciones- cambiar declaraciones
while
ydo-while
declaracionesfor
yenhanced for
declaracionesbreak
ycontinue
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. if
s 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 String
s 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 untrue
expresi贸n afalse
y viceversa.boolExpr1 & boolExpr2
: la Y operador eval煤a atrue
si ambas expresiones sontrue
.boolExpr1 | boolExpr2
: la O operador eval煤a atrue
si al menos una de las expresiones estrue
.boolExpr1 && boolExpr2
: el cortocircuito Y operador eval煤a atrue
s贸lo siboolExpr1
yboolExpr2
son ambostrue
. Se llama operador de cortocircuito porque si la primera expresi贸n esfalse
, ni siquiera evaluar谩 la segunda expresi贸n como la condici贸n b谩sica de que ambos deben sertrue
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 atrue
si al menos uno deboolExpr1
yboolExpr2
estrue
. Una versi贸n de cortocircuito del|
operador.boolExpr1 ^ boolExpr2
: la XOR operador eval煤a atrue
s贸lo siboolExpr1
yboolExpr2
se eval煤an de manera diferente, es decir, si solo uno de ellos estrue
y el otro esfalse
.
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.