Saltar al contenido principal
eLearner.app
Módulo 7 · Lección 1 de 213/14 en el curso~12 min
Lecciones del módulo (1/2)

Expresiones Lambda

A partir de Java 8, se introdujo el soporte a la programación funcional gracias a las Expresiones Lambda. Una lambda es esencialmente un método anónimo (una función sin nombre) que se puede pasar como argumento a métodos o almacenar en variables.

Las Interfaces Funcionales

Una expresión lambda solo se puede usar donde se requiera una Interfaz Funcional (Functional Interface). Se trata de una interfaz que declara un solo método abstracto. Java marca estas interfaces con la anotación opcional @FunctionalInterface.

Ejemplo de interfaz funcional definida por el usuario:

Code
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

Antes de Java 8, habríamos tenido que definir una clase anónima. Con las lambdas, la sintaxis se reduce a:

Code
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Ritorna 8

Estructura de las Expresiones Lambda

La sintaxis básica de una lambda es:

Code
(parametri) -> { corpo }
  • Sin parámetros: () -> System.out.println("Hello")
  • Un solo parámetro: x -> x * 2 (se pueden omitir los paréntesis)
  • Múltiples parámetros: (x, y) -> x + y
  • Cuerpo multilínea: si el cuerpo contiene varias instrucciones, se necesitan llaves {} y la instrucción return explícita.
Code
MathOperation detailedAddition = (a, b) -> {
    System.out.println("Somma in corso...");
    return a + b;
};

Interfaces Funcionales Estándar en Java

El paquete java.util.function proporciona muchas interfaces funcionales predefinidas:

  • Predicate<T>: acepta un argumento de tipo T y devuelve un booleano (método test(T t)).
  • Consumer<T>: acepta un argumento de tipo T y realiza una operación sin devolver nada (método accept(T t)).
  • Function<T, R>: acepta un argumento T y devuelve un resultado R (método apply(T t)).
  • Supplier<T>: no acepta argumentos y devuelve un valor T (método get()).

Pruébalo tú

Ejercicio#java.m7.l1.e1
Intentos: 0Cargando...

Completa el código instanciando la interfaz Calculator mediante una expresión lambda que sume dos enteros. Luego, invoca el método calculate pasando 5 y 3 e imprime el resultado en pantalla.

Cargando editor...
Mostrar pista

Declara `Calculator adder = (a, b) -> a + b;` y luego invoca `adder.calculate(5, 3)` dentro de la impresión.

Solución disponible después de 3 intentos

Ejercicio#java.m7.l1.e2
Intentos: 0Cargando...

Crea una instancia de la interfaz funcional estándar Predicate<String> llamada isLong usando una lambda que compruebe si la longitud de la cadena es mayor de 5 caracteres. Luego imprime el resultado de la prueba para la cadena 'hello world'.

Cargando editor...
Mostrar pista

La lambda para un `Predicate<String>` toma un parámetro `s` y devuelve `s.length() > 5` como condición booleana.

Solución disponible después de 3 intentos

Ejercicio#java.m7.l1.e3
Intentos: 0Cargando...

Ordena alfabéticamente la lista de cadenas names llamando al método sort() en ella y pasando una expresión lambda que implemente Comparator (tomando dos cadenas s1, s2 y comparándolas mediante compareTo).

Cargando editor...
Mostrar pista

Usa `names.sort((s1, s2) -> s1.compareTo(s2));` para ordenar la lista en su lugar.

Solución disponible después de 3 intentos