Java Lambda výrazy


Java Lambda výrazy

V Javě 8 byly přidány výrazy Lambda.

Výraz lambda je krátký blok kódu, který přebírá parametry a vrací hodnotu. Lambda výrazy jsou podobné metodám, ale nepotřebují název a lze je implementovat přímo do těla metody.


Syntax

Nejjednodušší výraz lambda obsahuje jeden parametr a výraz:

parameter -> expression

Chcete-li použít více než jeden parametr, zabalte je do závorek:

(parameter1, parameter2) -> expression

Výrazy jsou omezené. Musí okamžitě vrátit hodnotu a nemohou obsahovat proměnné, přiřazení nebo příkazy jako ifnebo for. Aby bylo možné provádět složitější operace, lze blok kódu použít se složenými závorkami. Pokud výraz lambda potřebuje vrátit hodnotu, pak by měl mít blok kódu returnpříkaz.

(parameter1, parameter2) -> { code block }

Použití lambda výrazů

Lambda výrazy jsou obvykle předávány jako parametry funkci:

Příklad

Pro tisk každé položky v seznamu použijte výraz lamba v metodě ArrayList's :forEach()

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); } );
  }
}

Lambda výrazy mohou být uloženy v proměnných, pokud je typ proměnné rozhraní, které má pouze jednu metodu. Výraz lambda by měl mít stejný počet parametrů a stejný návratový typ jako tato metoda. Java má mnoho z těchto druhů rozhraní zabudovaných, jako je Consumerrozhraní (najdete v java.utilbalíčku) používané seznamy.

Příklad

Použijte Consumerrozhraní Java k uložení výrazu lambda do proměnné:

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 );
  }
}

Chcete-li v metodě použít výraz lambda, metoda by měla mít jako typ parametr s rozhraním jedné metody. Volání metody rozhraní spustí výraz lambda:

Příklad

Vytvořte metodu, která jako parametr vezme výraz lambda:

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);
  }
}