Sobes.tech
Middle

Šta su lambda izrazi u Javi i koje mogućnosti pružaju?

sobes.tech АИ

Одговор од АИ

Lambda izrazi u Javi su kratak sintaks za kreiranje anonimnih funkcija (metoda bez imena) koje se mogu proslediti kao argumenti ili čuvati u promenljivima. U suštini, to su funkcionalni interfejsi implementirani "na licu mesta".

Glavne mogućnosti koje pružaju lambda izrazi:

  • Pojednostavljenje sintakse: Znatno skraćuju boilerplate kod pri radu sa funkcionalnim interfejsima u poređenju sa anonimnim unutrašnjim klasama.

    // Pre lambda:
    Runnable classicRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Klasični Runnable");
        }
    };
    
    // Sa lambda:
    Runnable lambdaRunnable = () -> System.out.println("Lambda Runnable");
    
  • Funkcionalno programiranje: Omogućavaju pisanje funkcionalnijeg koda, gde su funkcije prvoklasni građani i mogu se prosleđivati kao podaci. Ovo je ključno za rad sa Stream API.

    // Filtriranje liste pomoću lambda
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<String> filteredNames = names.stream()
                                     .filter(name -> name.startsWith("A"))
                                     .collect(Collectors.toList());
    
  • Rad sa Stream API: Lambda izrazi su osnova za većinu operacija u Stream API (filter, map, forEach, reduce i dr.), obezbeđujući konciznost i paralelno izvršavanje.

    // Transformacija i ispis elemenata stream-a
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.stream()
           .map(n -> n * n) // lambda za mapiranje
           .forEach(System.out::println); // referenca na metodu (varijanta lambda)
    
  • Unapređena čitljivost: Za jednostavne operacije, lambda čini kod preglednijim i razumljivijim, fokusirajući pažnju na samu operaciju, a ne na sintaksu anonimne klase.

  • Implementacija funkcionalnih interfejsa: Mogu se koristiti gde god se očekuje instanca funkcionalnog interfejsa (interfejs sa jednom apstraktnom metodom).

Sintaksa lambda izraza: (parametri) -> { telo }

Primeri:

  • Bez parametara, bez povratne vrednosti: () -> System.out.println("Hello")
  • Sa jednim parametrom, bez povratne vrednosti: name -> System.out.println("Hello, " + name) (može se izostaviti zagrada oko jednog parametra)
  • Sa više parametara, bez povratne vrednosti: (x, y) -> System.out.println(x + y)
  • Sa parametrima, sa povratnom vrednošću: (a, b) -> a + b (ako telo sadrži jedan izraz, njegova vrednost se implicitno vraća)
  • Sa parametrima, sa blokom koda i povratnom vrednošću: (a, b) -> { int sum = a + b; return sum; } (izričito return je potreban za blokove koda)