Sobes.tech
Middle

¿Qué son las expresiones lambda en Java y qué capacidades ofrecen?

sobes.tech AI

Respuesta de la IA

Las expresiones lambda en Java son una sintaxis concisa para crear funciones anónimas (métodos sin nombre) que pueden pasarse como argumentos o almacenarse en variables. Esencialmente, son interfaces funcionales implementadas "en tiempo real".

Las principales capacidades que ofrecen las expresiones lambda:

  • Simplificación de sintaxis: Reducen significativamente el código boilerplate al trabajar con interfaces funcionales en comparación con las clases internas anónimas.

    // Antes de lambda:
    Runnable classicRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Runnable clásico");
        }
    };
    
    // Con lambda:
    Runnable lambdaRunnable = () -> System.out.println("Runnable lambda");
    
  • Programación funcional: Permiten escribir código más funcional, donde las funciones son ciudadanos de primera clase y pueden pasarse como datos. Esto es clave para trabajar con la API Stream.

    // Filtrado de una lista usando lambda
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<String> filteredNames = names.stream()
                                     .filter(name -> name.startsWith("A"))
                                     .collect(Collectors.toList());
    
  • Trabajo con la API Stream: Las expresiones lambda son la base para la mayoría de las operaciones en la API Stream (filter, map, forEach, reduce, etc.), proporcionando concisión y ejecución paralela.

    // Transformación y salida de elementos del stream
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.stream()
           .map(n -> n * n) // lambda para mapeo
           .forEach(System.out::println); // referencia a método (alternativa a lambda)
    
  • Mejora de la legibilidad: Para operaciones simples, las lambdas hacen que el código sea más legible y comprensible, enfocándose en la operación en sí y no en la sintaxis de la clase anónima.

  • Implementación de interfaces funcionales: Pueden usarse en cualquier lugar donde se espere una instancia de una interfaz funcional (interfaz con un método abstracto único).

Sintaxis de la expresión lambda: (parámetros) -> { cuerpo }

Ejemplos:

  • Sin parámetros, sin valor de retorno: () -> System.out.println("Hola")
  • Con un parámetro, sin valor de retorno: name -> System.out.println("Hola, " + name) (puede omitirse los paréntesis alrededor de un solo parámetro)
  • Con varios parámetros, sin valor de retorno: (x, y) -> System.out.println(x + y)
  • Con parámetros, con valor de retorno: (a, b) -> a + b (si el cuerpo es una sola expresión, su valor se devuelve implícitamente)
  • Con parámetros, con bloque de código y valor de retorno: (a, b) -> { int sum = a + b; return sum; } (se requiere return explícito en bloques de código)