LE LAMBDA EXPRESSIONS IN JAVA
INTRODUZIONE
Una Lambda Expression la possiamo definire in prima approssimazione come un metodo anonimo. Questo ci dice subito due cose. La prima è che una espressione lambda è un metodo, la seconda è che il metodo non ha nome. Per essere più precisi dobbiamo dire però che una espressione lambda è una classe anonima che implementa una particolare tipo di interface chiamata Functional Interface.
LE FUNCTIONAL INTERFACE
Sono le fondamenta su cui si basano le Lambda Expression. Una Functional Interface contiene un solo metodo astratto. Andiamo a vedere un esempio.
Avremmo potuto inserire anche un metodo di default, ma di fatto non avrebbe cambiato le cose IMyInterface contiene un solo metodo astratto perciò è una interfaccia funzionale.
LE LAMBDA EXPRESSION
Osserviamo la figura.
Analizziamo la Lambda Expression. -> è un operatore, e si chiama operatore Lambda. Nella parte sinistra racchiusa tra parentesi definiamo i parametri della Espressione Lambda. In questo caso non ce ne sono tuttavia le parentesi sono obbligatorie come nella definizione di un metodo. A desta dell’operatore Lambda abbiamo il body, in questo caso rappresentato dal literal 15. Se il body è costituito da una sola riga non accorrono parentesi graffe, se il codice è racchiuso su più linee occorre metterle. Manca il valore di ritorno che in questo caso è un int.
Vediamo un’altra espressione.
Questa volta (vedi figura precedente) l’espressione ha un parametro, il tipo non serve viene inferito dal compilatore. L’espressione ritorna un boolean. Quando una Lambda Expression ha un solo parametro le parentesi tonde si possono omettere.
n -> n > 0
TARGET TYPE
Vedremo la relazione che esiste tra una espressione lambda e una interfaccia funzionale. L’interfaccia funzionale a cui agganciamo l’espressione lambda si chiama Target Type. Vediamo un esempio.
L’espressione Lambda diventa il codice del metodo controlla. Vediamo tutta la struttura con una figura.
Siamo partiti dalla Functional Interface che ha un solo metodo astratto. Poi dietro le quinte viene generata una classe che implementa questa interfaccia e il codice del metodo è l’espressione lambda. Infine, sempre dietro le quinte viene prodotta una istanza di questa classe che poi utilizziamo. In pratica una Lambda Expression trasforma una serie di istruzioni in un oggetto. Ritorniamo al nostro esempio che riporto per comodità.
La variabile mi è l’oggetto di cui abbiamo parlato, se adesso proviamo a eseguire il metodo mi.controlla(10) viene eseguita la Lambda Expression e il risultato sarà true. L’espressione lambda deve essere compatibile con il metodo della interface, altrimenti il compilatore ci segnalerà un errore.
UTLIZZIAMO UNA LAMBDA EXPRESSION
Inizieremo a capire a cosa ci servono le lambda expression.
(n) -> (n % 2) == 0
Verifica se un numero è pari (resto della divisione zero). Vediamo una forma leggermente diversa.
LAMBDA EXPRESSION CON UN BLOCCO DI CODICE
Una espressione lambda costituita da un sola istruzione si chiama Expression Lambda. Se costituita da più istruzioni si chiama Block Lambda. Vediamo subito un esempio.
LAMBDA EXPRESSION COME ARGOMENTO DI UN METODO
È uno dei più usati nelle lambda expression. Vediamo l’esempio, il codice dell’interfaccia omesso è quello precedente. Come secondo parametro di myMethod nel main andiamo a scrivere una espressione lambda compatibile con il metodo dell’interfaccia. Passiamo definizione e blocco di codice come argomento del metodo, assegnata alla variabile mi. Vediamo la classe di test.
LINK AI POST PRECEDENTI
LINK AL CODICE SU GITHUB
ESECUZIONE DEL CODICE DI ESEMPIO
- Scaricare il codice da GITHUB, lanciare il file JAR con il seguente comando in Visual Studio Code, posizionandosi nella directory contenente il JAR.
java -jar –enable-preview CorsoJava.jar
- Oppure mettere in esecuzione il main che si trova nel file CorsoJava.java.
Scrivi un commento