Sobes.tech
Middle

Kas yra lambda išraiškos Java ir kokias galimybes jos suteikia?

sobes.tech AI

Atsakymas iš AI

Lambdų išraiškos Java yra trumpas sintaksė kuriant anonimines funkcijas (bevardes metodus), kurias galima perduoti kaip argumentus arba saugoti kintamuosiuose. Iš esmės, tai yra įgyvendinti "gyvai" funkciniai interfeisai.

Pagrindinės galimybės, kurias suteikia lambdų išraiškos:

  • Sintezės supaprastinimas: Žymiai sutrumpina boilerplate kodą dirbant su funkciniais interfeisais, palyginti su anoniminių vidinių klasių naudojimu.

    // Prieš lambdą:
    Runnable classicRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Klasikinis Runnable");
        }
    };
    
    // Su lambda:
    Runnable lambdaRunnable = () -> System.out.println("Lambda Runnable");
    
  • Funkcinis programavimas: Leidžia rašyti labiau funkcinį kodą, kur funkcijos yra pirmosios klasės piliečiai ir gali būti perduodamos kaip duomenys. Tai yra svarbu dirbant su Stream API.

    // Filtravimas sąrašo naudojant lambda
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<String> filteredNames = names.stream()
                                     .filter(name -> name.startsWith("A"))
                                     .collect(Collectors.toList());
    
  • Darbas su Stream API: Lambdų išraiškos yra pagrindas daugeliui Stream API operacijų (filter, map, forEach, reduce ir kt.), užtikrinant glaustumą ir paralelinį vykdymą.

    // Elementų transformavimas ir išvedimas
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.stream()
           .map(n -> n * n) // lambda map funkcijai
           .forEach(System.out::println); // metodo nuoroda (lambda alternatyva)
    
  • Pagerinta skaitomumas: Paprastoms operacijoms lambdų išraiškos daro kodą aiškesnį ir lengviau suprantamą, sutelkiant dėmesį į pačią operaciją, o ne į anoniminių klasių sintaksę.

  • Funkcinių interfeisų įgyvendinimas: Gali būti naudojami bet kur, kur tikimasi funkcionalaus interfeiso pavyzdžio (interfeiso su viena abstrakčia metoda).

Lambdų išraiškos sintaksė: (parametrai) -> { kūnas }

Pavyzdžiai:

  • Be parametrų, be grąžinamos reikšmės: () -> System.out.println("Hello")
  • Su vienu parametru, be grąžinamos reikšmės: name -> System.out.println("Hello, " + name) (galima praleisti skliaustus aplink vieną parametrą)
  • Su keliais parametrais, be grąžinamos reikšmės: (x, y) -> System.out.println(x + y)
  • Su parametrais, su grąžinamos reikšmės: (a, b) -> a + b (jei kūnas sudarytas iš vieno išraiškos, jos reikšmė automatiškai grąžinama)
  • Su parametrais, su bloku ir grąžinamos reikšmės: (a, b) -> { int sum = a + b; return sum; } (aiškus return reikalingas blokams)