LE LAMBDA EXPRESSIONS IN JAVA

INTRODUZIONE

java-logoUna 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.

Interfaccia funzionale

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.

Default Method

LE LAMBDA EXPRESSION

Osserviamo la figura.

Lambda

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.

Valore di ritorno

Vediamo un’altra espressione.

Lambda

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.

Lambda

L’espressione Lambda diventa il codice del metodo controlla. Vediamo tutta la struttura con una figura.

Struttura

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

Lambda

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.

Lambda

(n) -> (n % 2) == 0

Verifica se un numero è pari (resto della divisione zero). Vediamo una forma leggermente diversa.

Lambda

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.

Block Lambda

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.

Classe di test

LINK AI POST PRECEDENTI

IL LINGUAGGIO JAVA

LINK AL CODICE SU GITHUB

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.