Čo sú to lambda výrazy v Jave a aké možnosti poskytujú?
sobes.tech AI
Odpoveď od AI
Lambda výrazy v Jave sú stručný zápis na vytváranie anonymných funkcií (metód bez mena), ktoré môžu byť odovzdané ako argumenty alebo uložené do premenných. V podstate ide o funkčné rozhrania implementované "za behu".
Hlavné možnosti, ktoré lambda výrazy poskytujú:
-
Zjednodušenie syntaxe: Výrazne skracujú boilerplate kód pri práci s funkčnými rozhraniami v porovnaní s anonymnými vnútornými triedami.
// Pred lambda: Runnable classicRunnable = new Runnable() { @Override public void run() { System.out.println("Klasický Runnable"); } }; // S lambdou: Runnable lambdaRunnable = () -> System.out.println("Lambda Runnable"); -
Funkcionálne programovanie: Umožňujú písanie viac funkcionálneho kódu, kde sú funkcie prvotriedni občania a môžu byť odovzdávané ako dáta. To je kľúčové pre prácu s Stream API.
// Filtrácia zoznamu pomocou lambda List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList()); -
Práca so Stream API: Lambda výrazy sú základom pre väčšinu operácií v Stream API (filter, map, forEach, reduce a pod.), zabezpečujú stručnosť a paralelné vykonávanie.
// Prevod a výpis prvkov streamu List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .map(n -> n * n) // lambda pre mapovanie .forEach(System.out::println); // odkaz na metódu (variant lambda) -
Vylepšená čitateľnosť: Pre jednoduché operácie lambda robí kód prehľadnejším a zrozumiteľnejším, zameriava pozornosť na samotnú operáciu, nie na syntax anonymnej triedy.
-
Implementácia funkčných rozhraní: Môžu byť použité kdekoľvek, kde sa očakáva inštancia funkčného rozhrania (rozhranie s jednou abstraktnou metódou).
Syntax lambda výrazu: (parametre) -> { telo }
Príklady:
- Bez parametrov, bez návratovej hodnoty:
() -> System.out.println("Hello") - S jedným parametrom, bez návratovej hodnoty:
name -> System.out.println("Hello, " + name)(možno vynechať zátvorky okolo jedného parametra) - S viacerými parametrami, bez návratovej hodnoty:
(x, y) -> System.out.println(x + y) - S parametrami, s návratovou hodnotou:
(a, b) -> a + b(ak telo obsahuje jeden výraz, jeho hodnota je implicitne vrátená) - S parametrami, s blokom kódu a návratovou hodnotou:
(a, b) -> { int sum = a + b; return sum; }(explicitnéreturnje potrebné pre bloky kódu)