Lambda (Java 8)

Alberto Ferrari
Ingegneria dell'Informazione, UniPR

Esempio

  • Visualizzazione di una lista di stringhe

Esempio 1

List colours = Arrays.asList("Red ", "Green ", "White ", "Black");
for (int i = 0; i < colours.size(); i++) {
    System.out.print(colours.get(i));
}
  • Accesso classico agli elementi

Esempio 2

Generics

List<String> colours = Arrays.asList("Red ", "Green ", "White ", "Black");
for (String a_colour : colours) {
  System.out.print(a_colour);
}
  • Il codice client chiede alla lista un elemento alla volta e poi decide cosa farne
  • Stile imperativo

Esempio 3

Consumer e metodo forEach (Java 8)

void    forEach(Consumer<? super T> action)
  • Consumer esegue un'azione per ogni elemento dello stream
  • E' necessario implementare il metodo accept che esegue una operazione sull'argomento ricevuto
void accept(T t)
  • Esempio:
List<String> colours = Arrays.asList("Red ", "Green ", "White ", "Black");
colours.forEach(new Consumer<String>() {
   public void accept(String colour) {
      System.out.print(colour);
   }
});
  • Il client dice alla lista cosa fare su ogni elemento della collezione

Esempio 4

Lambda expression

  • Sostituzione della inner class con una lambda expression (funzione anonima)
List<String> colours = Arrays.asList("Red ", "Green ", "White ", "Black");
colours.forEach((String colour) -> System.out.print(colour));
  • lambda expression dell'esempio formata da:
    • lista di parametri: (String s)
    • corpo della funzione: System.out.print(s)
    • separatore: ->
    • Il tipo di ritorno è dedotto dal contesto, in questo caso void.
    • Anonima: non c'è nome

Esempio 5

type inference

  • Type inference is a Java compiler's ability to look at each method invocation and corresponding declaration to determine the type argument (or arguments) that make the invocation applicable
  • The inference algorithm determines the types of the arguments and, if available, the type that the result is being assigned, or returned
List<String> colours = Arrays.asList("Red ", "Green ", "White ", "Black");
colours.forEach(colour -> System.out.print(colour));

Esempio 6

method reference

  • Method reference
  • You use lambda expressions to create anonymous methods.
  • Sometimes, however, a lambda expression does nothing but call an existing method.
  • In those cases, it's often clearer to refer to the existing method by name.
  • Method references enable you to do this.
List<String> colours = Arrays.asList("Red ", "Green ", "White ", "Black");
colours.forEach(System.out::print);

Alberto Ferrari
Ingegneria dell'Informazione, UniPR
www.ce.unipr.it/~aferrari/