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:
Runnablees 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:
MyFunctionalInterfacees 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:
MathOperationes una interfaz funcional con un métodooperation.- Las lambdas
(a, b) -> a + by(a, b) -> a - bimplementan 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
