Š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čitoreturnje potreban za blokove koda)