Sobes.tech
Middle

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í return je nutný pro bloky kódu)