Las expresiones lambda, introducidas en Java 8, son una característica poderosa que permite tratar la funcionalidad como un argumento del método o almacenar el comportamiento en una variable. Las lambdas facilitan la programación funcional en Java, permitiendo escribir código más conciso y legible.
Conceptos Clave
-
Sintaxis de las Expresiones Lambda:
(argumentos) -> {cuerpo}
- Ejemplo:
(int a, int b) -> { return a + b; }
-
Tipos de Expresiones Lambda:
- Sin parámetros:
() -> System.out.println("Hello, World!");
- Con un parámetro:
(a) -> a * 2
- Con múltiples parámetros:
(a, b) -> a + b
- Sin parámetros:
-
Uso de Expresiones Lambda:
- Principalmente utilizadas con interfaces funcionales (interfaces con un solo método abstracto).
Ejemplos Prácticos
Ejemplo 1: Lambda sin Parámetros
Explicación:
Runnable
es una interfaz funcional con un solo métodorun()
.- La lambda
() -> System.out.println("Hola, Mundo!")
implementa el métodorun()
.
Ejemplo 2: Lambda con un Parámetro
interface MyFunctionalInterface { void display(String message); } public class LambdaExample { public static void main(String[] args) { MyFunctionalInterface msg = (message) -> System.out.println(message); msg.display("Hola desde una expresión lambda!"); } }
Explicación:
MyFunctionalInterface
es una interfaz funcional con un métododisplay
.- La lambda
(message) -> System.out.println(message)
implementa el métododisplay
.
Ejemplo 3: Lambda con Múltiples Parámetros
interface MathOperation { int operation(int a, int b); } public class LambdaExample { public static void main(String[] args) { MathOperation addition = (a, b) -> a + b; MathOperation subtraction = (a, b) -> a - b; System.out.println("10 + 5 = " + addition.operation(10, 5)); System.out.println("10 - 5 = " + subtraction.operation(10, 5)); } }
Explicación:
MathOperation
es una interfaz funcional con un métodooperation
.- Las lambdas
(a, b) -> a + b
y(a, b) -> a - b
implementan el métodooperation
.
Ejercicios Prácticos
Ejercicio 1: Lambda para Filtrar una Lista
Descripción: Escribe una expresión lambda que filtre una lista de enteros y devuelva solo los números pares.
Código Inicial:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class LambdaExercise { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Filtrar números pares usando una expresión lambda List<Integer> evenNumbers = numbers.stream() .filter(/* tu código aquí */) .collect(Collectors.toList()); System.out.println(evenNumbers); } }
Solución:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class LambdaExercise { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Filtrar números pares usando una expresión lambda List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); } }
Ejercicio 2: Lambda para Ordenar una Lista
Descripción: Escribe una expresión lambda que ordene una lista de cadenas en orden alfabético inverso.
Código Inicial:
import java.util.Arrays; import java.util.List; public class LambdaExercise { public static void main(String[] args) { List<String> names = Arrays.asList("Ana", "Carlos", "Beatriz", "David"); // Ordenar la lista en orden alfabético inverso usando una expresión lambda names.sort(/* tu código aquí */); System.out.println(names); } }
Solución:
import java.util.Arrays; import java.util.List; public class LambdaExercise { public static void main(String[] args) { List<String> names = Arrays.asList("Ana", "Carlos", "Beatriz", "David"); // Ordenar la lista en orden alfabético inverso usando una expresión lambda names.sort((a, b) -> b.compareTo(a)); System.out.println(names); } }
Errores Comunes y Consejos
-
No especificar el tipo de datos:
- Java puede inferir el tipo de datos en muchos casos, pero a veces es necesario especificarlo para evitar errores de compilación.
-
Usar lambdas con interfaces no funcionales:
- Las lambdas solo pueden usarse con interfaces funcionales (interfaces con un solo método abstracto).
-
Olvidar el bloque de código en lambdas complejas:
- Para lambdas con múltiples líneas de código, usa
{}
para definir el bloque de código.
- Para lambdas con múltiples líneas de código, usa
Conclusión
Las expresiones lambda son una herramienta poderosa en Java que permiten escribir código más limpio y conciso. Al entender y practicar su uso, puedes mejorar significativamente la eficiencia y legibilidad de tu código. En el siguiente módulo, exploraremos las interfaces y cómo se integran con las expresiones lambda para crear aplicaciones más robustas y flexibles.
Curso de Programación en Java
Módulo 1: Introducción a Java
- Introducción a Java
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Operadores
Módulo 2: Flujo de Control
Módulo 3: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Métodos
- Constructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Programación Orientada a Objetos Avanzada
Módulo 5: Estructuras de Datos y Colecciones
Módulo 6: Manejo de Excepciones
- Introducción a las Excepciones
- Bloque Try-Catch
- Throw y Throws
- Excepciones Personalizadas
- Bloque Finally
Módulo 7: Entrada/Salida de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Flujos de Archivos
- BufferedReader y BufferedWriter
- Serialización
Módulo 8: Multihilo y Concurrencia
- Introducción al Multihilo
- Creación de Hilos
- Ciclo de Vida de un Hilo
- Sincronización
- Utilidades de Concurrencia
Módulo 9: Redes
- Introducción a las Redes
- Sockets
- ServerSocket
- DatagramSocket y DatagramPacket
- URL y HttpURLConnection