Sobes.tech
Middle

Č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é return je potrebné pre bloky kódu)