Espressioni Lambda Java


Espressioni Lambda Java

Le espressioni Lambda sono state aggiunte in Java 8.

Un'espressione lambda è un breve blocco di codice che accetta parametri e restituisce un valore. Le espressioni Lambda sono simili ai metodi, ma non necessitano di un nome e possono essere implementate direttamente nel corpo di un metodo.


Sintassi

L'espressione lambda più semplice contiene un singolo parametro e un'espressione:

parameter -> expression

Per utilizzare più di un parametro, racchiuderli tra parentesi:

(parameter1, parameter2) -> expression

Le espressioni sono limitate. Devono restituire immediatamente un valore e non possono contenere variabili, assegnazioni o istruzioni come ifo for. Per eseguire operazioni più complesse, è possibile utilizzare un blocco di codice con parentesi graffe. Se l'espressione lambda deve restituire un valore, il blocco di codice dovrebbe avere returnun'istruzione.

(parameter1, parameter2) -> { code block }

Utilizzo delle espressioni Lambda

Le espressioni Lambda vengono generalmente passate come parametri a una funzione:

Esempio

Usa un'espressione lamba nel metodo ArrayList's forEach()per stampare ogni elemento nell'elenco:

import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    numbers.forEach( (n) -> { System.out.println(n); } );
  }
}

Le espressioni Lambda possono essere archiviate in variabili se il tipo della variabile è un'interfaccia che ha un solo metodo. L'espressione lambda dovrebbe avere lo stesso numero di parametri e lo stesso tipo restituito di quel metodo. Java ha molti di questi tipi di interfacce integrate, come l' Consumerinterfaccia (trovata nel java.utilpacchetto) utilizzata dalle liste.

Esempio

Usa l' Consumerinterfaccia di Java per memorizzare un'espressione lambda in una variabile:

import java.util.ArrayList;
import java.util.function.Consumer;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    Consumer<Integer> method = (n) -> { System.out.println(n); };
    numbers.forEach( method );
  }
}

Per usare un'espressione lambda in un metodo, il metodo deve avere un parametro con un'interfaccia a metodo singolo come tipo. Chiamando il metodo dell'interfaccia verrà eseguita l'espressione lambda:

Esempio

Crea un metodo che accetta un'espressione lambda come parametro:

interface StringFunction {
  String run(String str);
}

public class Main {
  public static void main(String[] args) {
    StringFunction exclaim = (s) -> s + "!";
    StringFunction ask = (s) -> s + "?";
    printFormatted("Hello", exclaim);
    printFormatted("Hello", ask);
  }
  public static void printFormatted(String str, StringFunction format) {
    String result = format.run(str);
    System.out.println(result);
  }
}