Co jsou to lambda výrazy v Java a jaké možnosti nabízejí?
sobes.tech AI
Odpověď od AI
Lambda výrazy v Javě jsou stručný zápis pro vytváření anonymních funkcí (metod bez jména), které lze předávat jako argumenty nebo ukládat do proměnných. V podstatě se jedná o funkční rozhraní implementovaná "za běhu".
Hlavní možnosti, které lambda výrazy poskytují:
-
Zjednodušení syntaxe: Výrazně zkracují boilerplate kód při práci s funkčními rozhraními ve srovnání s anonymními vnitřními třídami.
// Před lambda: Runnable classicRunnable = new Runnable() { @Override public void run() { System.out.println("Klasický Runnable"); } }; // S lambdou: Runnable lambdaRunnable = () -> System.out.println("Lambda Runnable"); -
Funkcionální programování: Umožňují psát více funkcionální kód, kde jsou funkce prvotřídní občané a mohou být předávány jako data. To je klíčové pro práci s Stream API.
// Filtrace seznamu pomocí lambda List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList()); -
Práce se Stream API: Lambda výrazy jsou základem pro většinu operací v Stream API (filter, map, forEach, reduce atd.), zajišťují stručnost a paralelní provádění.
// Převod a výpis prvků streamu List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .map(n -> n * n) // lambda pro mapování .forEach(System.out::println); // odkaz na metodu (varianta lambda) -
Vylepšená čitelnost: Pro jednoduché operace lambda zpřehledňují kód a činí jej srozumitelnějším, zaměřují pozornost na samotnou operaci, nikoli na syntaxi anonymní třídy.
-
Implementace funkčních rozhraní: Mohou být použity všude, kde je očekáván exemplář funkčního rozhraní (rozhraní s jednou abstraktní metodou).
Syntaxe lambda výrazu: (parametry) -> { tělo }
Příklady:
- Bez parametrů, bez návratové hodnoty:
() -> System.out.println("Hello") - S jedním parametrem, bez návratové hodnoty:
name -> System.out.println("Hello, " + name)(lze vynechat závorky kolem jednoho parametru) - S více parametry, bez návratové hodnoty:
(x, y) -> System.out.println(x + y) - S parametry, s návratovou hodnotou:
(a, b) -> a + b(pokud tělo obsahuje jedno výraz, jeho hodnota je implicitně vrácena) - S parametry, s blokem kódu a návratovou hodnotou:
(a, b) -> { int sum = a + b; return sum; }(explicitníreturnje nutný pro bloky kódu)