Vai al contenuto
eLearner.app
Modulo 7 · Lezione 1 di 213/14 nel corso~12 min
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:

Code
@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:

Code
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 è:

Code
(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'istruzione return esplicita.
Code
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 tipo T e restituisce un booleano (metodo test(T t)).
  • Consumer<T>: accetta un argomento di tipo T ed esegue un'operazione senza ritornare nulla (metodo accept(T t)).
  • Function<T, R>: accetta un argomento T e restituisce un risultato R (metodo apply(T t)).
  • Supplier<T>: non accetta argomenti e restituisce un valore T (metodo get()).

Prova tu

Esercizio#java.m7.l1.e1
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Dichiara `Calculator adder = (a, b) -> a + b;` e poi invoca `adder.calculate(5, 3)` dentro la stampa.

Soluzione disponibile dopo 3 tentativi

Esercizio#java.m7.l1.e2
Tentativi: 0Caricamento…

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'.

Caricamento editor…
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

Esercizio#java.m7.l1.e3
Tentativi: 0Caricamento…

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).

Caricamento editor…
Mostra suggerimento

Usa `names.sort((s1, s2) -> s1.compareTo(s2));` per ordinare in loco la lista.

Soluzione disponibile dopo 3 tentativi