Bienvenidos un día más al curso de Java orientado al mundo laboral. ¿Qué tal vais?. Yo de vuelta a mi trabajo y haciendo el curso en ratos libres 😜.
Hoy quiero enseñaros otra de las patas de este banco llamado programación. Esta se llama estructuras de control y bucles. Un básico que vas a usar todos los días que estés desarrollando tu proyecto.
¡Pues vamos al lío!
Recuerda que es muy importante que pruebes los códigos y sobre todo resuelvas los ejercicios (sin pedírselo a ChatGpt 😏), voy a dejar la solución en los comentarios.
If/else/else If
Esta es la estructura más básica y usada como base de las tomas de decisiones en programación.
Diferencia entre if/else e if/else if
if/else:
Esta estructura se usa para controlar dos posibles casos. Cuando la condición es verdadera (if) y cuando no lo es (else). Es la opción más simple y directa si tienes sólo 2 casos.
Ejemplo que comprueba si una persona es mayor de edad:
int age = 20;
if (age >= 18) {
System.out.println("Es mayor de edad.");
} else {
System.out.println("Es menor de edad.");
}
if/else if:
Se usa cuando hay más de dos casos posibles, que deben ser evaluados. Te permite encadenar condiciones para cubrir múltiples escenarios.
Importante: el programa revisa cada condición por orden y cuando encuentra alguna que se cumpla ejecuta lo que haya dentro e ignora las demás.
Ejemplo:
public static void main(String[] args) {
String paymentMethod = "CreditCard";
if (paymentMethod.equals("CreditCard")) {
System.out.println("Pago con tarjeta de crédito...");
} else if (paymentMethod.equals("PayPal")) {
System.out.println("Pago con PayPal...");
} else {
System.out.println("Método de pago no reconocido.");
}
}
¿Por qué no comparar cadenas (String) con ==?
Puede que te hayas dado cuenta que en el ejemplo anterior no hacemos if (paymentMethod == "CreditCard") para comprobar si el contenido de String paymentMethod es igual a "CreditCard" , ¿por qué?
En Java, el operador == compara referencias de memoria y no el contenido real de las cadenas. Esto significa que aunque dos cadenas tengan el mismo contenido, == puede devolver false si están almacenadas en diferentes lugares en la memoria.
Solucion: Usar .equals(). El método .equals() compara el contenido de las cadenas, lo que asegura que la comparación sea exacta.
Ejemplo problemático:
Aquí comparamos 2 String que contienen “Hola” y Java nos dice que son diferentes.😳
String str1 = new String("Hola");
String str2 = new String("Hola");
if (str1 == str2) {
System.out.println("Son iguales.");
} else {
System.out.println("Son diferentes.");
}
Salida: Son diferentes ❌.
if (str1.equals(str2)) {
System.out.println("Son iguales.");
} else {
System.out.println("Son diferentes.");
}
Salida: Son iguales ✅.
Consejo laboral:
Siempre usa .equals() o .equalsIgnoreCase() para comparar cadenas en sistemas reales. Usar == para cadenas o enum es un error común que puede causar fallos difíciles de detectar, especialmente en aplicaciones con validaciones de datos de usuarios, como nombres o correos electrónicos.
Programa como un PRO, el operador ternario.
Cuando sólo tengas 2 posibles condiciones que puedes controlar con un if/else, puedes usar el operador ternario.
Este hace que el código sea más legible y simple. No es válido para todas las ocasiones pero si para una parte de ellas. Aquí puedes ver como actúa en un ejemplo anterior.
If Normal:
int age = 20;
if (age >= 18) {
System.out.println("Es mayor de edad.");
} else {
System.out.println("Es menor de edad.");
}
Mismo caso con operador ternario:
System.out.println(age >= 18 ? "Es mayor de edad" : "Es menor de edad");
Al igual que antes, lo que estamos haciendo es comprobar si “age” es mayor o igual que 18.
Con “?” estamos indicando que si es verdadero muestre "Es mayor de edad" y con “:” indicamos que en caso contrario muestre "Es menor de edad".
Este operador podemos usarlo, o no, según la situación o nuestro criterio. Si te sientes más cómodo con un if/else normal puedes seguir usándolo pero recuerda que el ternario nos ayuda a crear código más limpio y legible.
Ejercicio 1: Validar la categoría de un cliente
Crea un programa que solicite al usuario ingresar la categoría de un cliente (con la clase Scanner). Las categorías válidas son: Premium y Estándar.
Si el usuario ingresa una categoría válida, el programa debe mostrar un mensaje indicando a qué categoría pertenece el cliente.
Si la categoría no es válida, muestra un mensaje de error.
Nota: La comparación debe ser sensible a mayúsculas o minúsculas (más arriba vimos cómo comparar cadenas sin importar mayúsculas o minúsculas).
Switch: Simplificando decisiones múltiples
El switch es una estructura utilizada para manejar múltiples condiciones de una forma más ordenada y limpia que un conjunto de if/else if. Puedes utilizarlo cuando tengas que anidar más de 3 o 4 if/else.
A partir de la versión 12 de Java, esta estructura mejoró de manera significativa. Nosotros vamos a suponer que usas una versión superior a la 12, por lo que vamos a explicar la versión nueva.
Vamos directamente a ver un ejemplo de un programa al que le pasamos el número de un día de la semana y nos dice si es laborable o fin de semana.
int day = 6;
String dayType = switch (day) {
case 1, 2, 3, 4, 5 -> "Día laborable";
case 6, 7 -> "Fin de semana";
default -> "Día no válido";
};
System.out.println(dayType);
Aquí creamos la variable “dayType”. El switch evalúa el valor de la variable “day”. En caso de que su valor sea 1, 2, 3, 4 o 5 le asigna "Día laborable" a “dayType”.
En caso de que sea 6 o 7 le asigna "Fin de semana" a “dayType”.
Por último, en caso de que sea cualquier otro valor le asigna "Día no válido" a “dayType”.
Esto es mucho más óptimo que crear un if/else if gigante donde contemplar los 7 días, te animo a que lo intentes crear y veas la diferencia.
Ejercicio 2
Realiza el ejercicio anterior usando un switch y añadiendo otro tipo de usuario llamado “no registrado”.
Bucles
Necesitamos utilizar bucles cuando queremos repetir varias veces seguidas un código específico. Ya sea para recorrer Arrays, procesar datos en lote o cualquier otro propósito donde necesitemos repetir código.
Tipos de bucles en Java
Java ofrece diferentes tipos de bucles para abordar distintos escenarios. Aquí están los más comunes:
for: Se utiliza cuando conoces el número exacto de repeticiones.
while: Se ejecuta mientras una condición sea verdadera.
do-while: Se ejecuta al menos una vez antes de evaluar la condición.
for-each: Específico para recorrer colecciones o arreglos (arrays).
Bucle for y for-each en Java
Vamos a profundizar en dos tipos de bucles esenciales: for y for-each. No solo aprenderás cómo funcionan, sino también cómo interpretarlos en situaciones reales de desarrollo.
El bucle for: Control detallado sobre las iteraciones
El bucle for es ideal para cuando necesitas repetir un bloque de código un número específico de veces o quieres tener control sobre las iteraciones mediante una variable de control.
Estructura del bucle for
for (inicialización; condición; incremento) {
// Código que se ejecuta en cada iteración
}
Partes del bucle for
Inicialización: Se ejecuta solo una vez al comienzo del bucle. Aquí inicializas una variable que controlará las iteraciones.
Condición: Evalúa si el bucle debe continuar. Mientras la condición sea true, el bucle sigue ejecutándose.
Incremento/Decremento: Modifica la variable de control después de cada iteración. Puede aumentar (++) o disminuir (--) su valor.
Ejemplo 1:
Imprimir por consola números del 1 al 5
for (int i = 1; i <= 5; i++) {
System.out.println("Número: " + i);
}
Explicación del código:
Inicialización: int i = 1; → La variable i comienza en 1.
Condición: i <= 5; → Mientras i sea menor o igual a 5, el bucle continúa.
Incremento: i++ → Después de cada iteración, el valor de i aumenta en 1.
Salida del código:
Número: 1
Número: 2
Número: 3
Número: 4
Número: 5
La Iteración 1, imprime "Número: 1".
La Iteración 2, imprime "Número: 2".
Y así sucesivamente hasta que “i” sea 6, momento en que la condición “i <= 5” es falsa y el bucle termina.
Ejemplo 2:
Sumar los primeros 5 números
int suma = 0;
for (int i = 1; i <= 5; i++) {
suma += i; // Es equivalente a suma = suma + i
}
System.out.println("La suma total es: " + suma);
Explicación del código:
La variable suma comienza en 0.
En cada iteración, el valor de i se agrega a suma. Por ejemplo:
Iteración 1: i = 1, suma = 0 + 1 = 1.
Iteración 2: i = 2, suma = 1 + 2 = 3.
Iteración 3: i = 3, suma = 3 + 3 = 6.
Iteración 4: i = 4, suma = 6 + 4 = 10.
Iteración 5: i = 5, suma = 10 + 5 = 15.
Salida del código:
La suma total es: 15
¿Cuándo usarlo? Este tipo de lógica es común en cálculos matemáticos, como sumar elementos o procesar datos numéricos.
Uso de break en el bucle for
Puedes detener un bucle antes de que complete todas sus iteraciones con la palabra clave break.
for (int i = 1; i <= 10; i++) {
if (i == 5) {
System.out.println("Bucle detenido en: " + i);
break;
}
System.out.println("Número: " + i);
}
Explicación del código:
Cuando “i” llega a 5, el bloque if se ejecuta y el break interrumpe el bucle.
El bucle no llega a imprimir los números 6, 7, 8, etc.
Salida del código:
Número: 1
Número: 2
Número: 3
Número: 4
Bucle detenido en: 5
¿Cuándo usar break? Es útil cuando encuentras un caso especial en el que ya no es necesario seguir iterando, como encontrar un error o un dato clave en un proceso.
El bucle for-each
El bucle for-each está diseñado específicamente para recorrer colecciones o arreglos de una manera más sencilla y legible. No tienes que preocuparte por índices ni condiciones.
En mi trabajo es el bucle que más uso. Es muy útil por ejemplo cuando tienes un array con id de clientes y tienes que llamar a un servicio que traiga toda la info de cada cliente usando su id.
Estructura del bucle for-each
for (Tipo elemento : colección) {
// Código que se ejecutará para cada elemento
}
Tipo: El tipo de dato que contiene la colección.
elemento: Representa el elemento actual en cada iteración.
colección: Es el arreglo o lista que se recorre.
Ejemplo 1:
Recorrer un arreglo de nombres
String[] nombres = {"Ana", "Luis", "Carlos", "María"};
for (String nombre : nombres) {
System.out.println("Hola, " + nombre);
}
Explicación del código:
En cada iteración, el bucle toma un elemento del arreglo nombres y lo asigna a la variable nombre.
Luego, ejecuta el bloque de código con ese valor.
Iteraciones:
Iteración 1: nombre = "Ana", imprime "Hola, Ana".
Iteración 2: nombre = "Luis", imprime "Hola, Luis".
Y así sucesivamente hasta que no queden elementos.
Salida del código:
Hola, Ana
Hola, Luis
Hola, Carlos
Hola, María
Ejemplo 2:
Calcular la suma total de los precios.
double[] precios = {100.50, 200.75, 300.25};
double total = 0;
for (double precio : precios) {
total += precio; // Suma cada precio al total
}
System.out.println("El total es: $" + total);
Explicación del código:
En cada iteración, el bucle toma un valor del arreglo precios y lo suma al total.
Por ejemplo:
Iteración 1: precio = 100.50, total = 0 + 100.50 = 100.50.
Iteración 2: precio = 200.75, total = 100.50 + 200.75 = 301.25.
Iteración 3: precio = 300.25, total = 301.25 + 300.25 = 601.50.
Salida del código:
El total es: $601.5
Ejercicio: Lista de nombres con saludo personalizado
Escribe un programa en Java que recorra una lista de nombres y genere un saludo personalizado para cada uno de ellos.
Instrucciones:
Crea un array llamado
nombres
que contenga al menos cinco nombres (por ejemplo: "Ana", "Luis", "Sofía", "Pedro", "Carla").Usa un bucle
for
para recorrer el array.Dentro del bucle, imprime un mensaje en el formato:
"¡Hola, [nombre]! Bienvenido al curso de Java."
Al final, muestra un mensaje indicando cuántos nombres fueron saludados.
Salida esperada:
¡Hola, Ana! Bienvenido al curso de Java.
¡Hola, Luis! Bienvenido al curso de Java.
¡Hola, Sofía! Bienvenido al curso de Java.
¡Hola, Pedro! Bienvenido al curso de Java.
¡Hola, Carla! Bienvenido al curso de Java.
Se saludaron a 5 personas en total.
Bucle while
Un bucle while permite ejecutar código repetidamente según una condición booleana determinada (true or false).
Comienza evaluando la condición booleana. Si es verdadera se ejecutan las instrucciones que haya dentro del bucle, si es falsa no entra al bucle y salta a la siguiente línea.
Ejemplo:
Leer datos de un usuario hasta que introduzca "salir". En este ejemplo hemos incluido la clase Scanner. Esta se utiliza para permitir que el usuario introduzca un texto por consola, por lo que podemos dar un valor a la variable entrada de forma dinámica.
Scanner scanner = new Scanner(System.in);
String entrada = "";
while (!entrada.equals("salir")) {
System.out.println("Introduce un texto (escribe 'salir' para terminar):");
entrada = scanner.nextLine();
}
System.out.println("Programa terminado.");
¿Cómo funciona?
Evalúa la condición de que “entrada” no sea igual a “salir” antes de ejecutar el bloque de código.
Si la condición es true sale del bucle porque hemos usado “!” para negar.
Si la condición es false, se vuelve a ejecutar el código para pedir un texto.
Nos va a seguir pidiendo un texto hasta que escribamos “salir”.
El bucle do-while
El bucle do-while es similar al while, pero garantiza que el bloque de código se ejecute al menos una vez, ya que evalúa la condición después de ejecutar el código.
Ejemplo:
Mostrar un menú hasta que el usuario elija salir:
Scanner scanner = new Scanner(System.in);
int opcion;
do {
System.out.println("Menú:");
System.out.println("1. Paella");
System.out.println("2. Muslo de pollo");
System.out.println("3. Salir");
System.out.print("Selecciona una opción: ");
opcion = scanner.nextInt();
} while (opcion != 3);
System.out.println("Programa finalizado.");
¿Cómo funciona?
Ejecuta el bloque de código en el que se pide al usuario un número del menú.
Luego evalúa la condición. Si es true (opcion no es 3), repite el bloque; si es false (opcion es 3), termina.
Y con esto hemos cubierto todo sobre las estructuras de control y los bucles. No te olvides de hacer los ejercicios, dejar comentarios si tienes dudas y nos vemos en la siguiente clase.
Ejercicio 1:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Ingrese la categoría del cliente (Premium, Estándar, Básico):");
String categoria = scanner.nextLine();
if (categoria.equalsIgnoreCase("Premium")) {
System.out.println("El cliente pertenece a la categoría Premium.");
} else if (categoria.equalsIgnoreCase("Estándar")) {
System.out.println("El cliente pertenece a la categoría Estándar.");
} else {
System.out.println("Error: La categoría ingresada no es válida.");
}
scanner.close();
}
Ejercicio 2:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Ingrese la categoría del cliente (Premium, Estándar, Básico):");
String categoria = scanner.nextLine();
switch (categoria.toLowerCase()) {
case "premium" -> System.out.println("El cliente pertenece a la categoría Premium.");
case "estandar" -> System.out.println("El cliente pertenece a la categoría Estándar.");
case "no registrado" -> System.out.println("El cliente es un usuario no registrado");
default -> System.out.println("Error: La categoría ingresada no es válida.");
}
scanner.close();
}
Ejercicio bucle for-each:
public static void main(String[] args) {
// Lista de nombres
List<String> nombres = List.of("Ana", "Juan", "Carlos", "María");
// Recorrer la lista con un bucle for
for (String nombre : nombres) {
switch (nombre) {
case "Ana" -> System.out.println("¡Hola Ana! Qué bueno verte.");
case "Juan" -> System.out.println("¡Hola Juan! ¿Cómo va todo?");
case "Carlos" -> System.out.println("¡Hola Carlos! ¿Listo para el día?");
case "María" -> System.out.println("¡Hola María! ¡Qué alegría verte!");
default -> System.out.println("¡Hola! Encantado de conocerte.");
}
}
}