Lezioni del modulo (1/2)
Espressioni Lambda
A partire da Java 8, è stato introdotto il supporto alla programmazione funzionale grazie alle Espressioni Lambda. Una lambda è essenzialmente un metodo anonimo (una funzione senza nome) che può essere passata come argomento a metodi o memorizzata in variabili.
Le Interfacce Funzionali
Un'espressione lambda può essere usata solo dove è richiesta un'Interfaccia Funzionale (Functional Interface). Si tratta di un'interfaccia che dichiara un solo metodo astratto. Java contrassegna queste interfacce con l'annotazione opzionale @FunctionalInterface.
Esempio di interfaccia funzionale definita dall'utente:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}
Prima di Java 8, avremmo dovuto definire una classe anonima. Con le lambda, la sintassi si riduce a:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Ritorna 8
Struttura delle Espressioni Lambda
La sintassi di base di una lambda è:
(parametri) -> { corpo }
- Senza parametri:
() -> System.out.println("Hello") - Singolo parametro:
x -> x * 2(le parentesi tonde possono essere omesse) - Più parametri:
(x, y) -> x + y - Corpo multi-linea: se il corpo contiene più istruzioni, servono le parentesi graffe
{}e l'istruzionereturnesplicita.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Somma in corso...");
return a + b;
};
Interfacce Funzionali Standard in Java
Il pacchetto java.util.function fornisce molte interfacce funzionali predefinite:
Predicate<T>: accetta un argomento di tipoTe restituisce un booleano (metodotest(T t)).Consumer<T>: accetta un argomento di tipoTed esegue un'operazione senza ritornare nulla (metodoaccept(T t)).Function<T, R>: accetta un argomentoTe restituisce un risultatoR(metodoapply(T t)).Supplier<T>: non accetta argomenti e restituisce un valoreT(metodoget()).
Prova tu
Completa il codice instanziando l'interfaccia Calculator tramite un'espressione lambda che somma due interi. Successivamente, invoca il metodo calculate passando 5 e 3 e stampa il risultato a schermo.
Mostra suggerimento
Dichiara `Calculator adder = (a, b) -> a + b;` e poi invoca `adder.calculate(5, 3)` dentro la stampa.
Soluzione disponibile dopo 3 tentativi
Crea una istanza dell'interfaccia funzionale standard Predicate<String> chiamata isLong usando una lambda che controlla se la lunghezza della stringa è maggiore di 5 caratteri. Successivamente stampa il risultato del test per la stringa 'hello world'.
Mostra suggerimento
La lambda per un `Predicate<String>` prende un parametro `s` e ritorna `s.length() > 5` come condizione booleana.
Soluzione disponibile dopo 3 tentativi
Ordina alfabeticamente la lista di stringhe names richiamando il metodo sort() su di essa e passando un'espressione lambda che implementi Comparator (prendendo due stringhe s1, s2 e confrontandole tramite compareTo).
Mostra suggerimento
Usa `names.sort((s1, s2) -> s1.compareTo(s2));` per ordinare in loco la lista.
Soluzione disponibile dopo 3 tentativi