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:
@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:
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:
(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ónreturnexplícita.
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 tipoTy devuelve un booleano (métodotest(T t)).Consumer<T>: acepta un argumento de tipoTy realiza una operación sin devolver nada (métodoaccept(T t)).Function<T, R>: acepta un argumentoTy devuelve un resultadoR(métodoapply(T t)).Supplier<T>: no acepta argumentos y devuelve un valorT(métodoget()).
Pruébalo tú
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.
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
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'.
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
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).
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