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

  1. Sintaxis de las Expresiones Lambda:

    • (argumentos) -> {cuerpo}
    • Ejemplo: (int a, int b) -> { return a + b; }
  2. 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
  3. 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

Runnable r = () -> System.out.println("Hola, Mundo!");
r.run();

Explicación:

  • Runnable es una interfaz funcional con un solo método run().
  • La lambda () -> System.out.println("Hola, Mundo!") implementa el método run().

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étodo display.
  • La lambda (message) -> System.out.println(message) implementa el método display.

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étodo operation.
  • Las lambdas (a, b) -> a + b y (a, b) -> a - b implementan el método operation.

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

  1. 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.
  2. Usar lambdas con interfaces no funcionales:

    • Las lambdas solo pueden usarse con interfaces funcionales (interfaces con un solo método abstracto).
  3. 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.

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

Módulo 2: Flujo de Control

Módulo 3: Programación Orientada a Objetos

Módulo 4: Programación Orientada a Objetos Avanzada

Módulo 5: Estructuras de Datos y Colecciones

Módulo 6: Manejo de Excepciones

Módulo 7: Entrada/Salida de Archivos

Módulo 8: Multihilo y Concurrencia

Módulo 9: Redes

Módulo 10: Temas Avanzados

Módulo 11: Frameworks y Librerías de Java

Módulo 12: Construcción de Aplicaciones del Mundo Real

© Copyright 2024. Todos los derechos reservados