Salt la conținutul principal
Modulul 7 · Lecția 1 din 213/14 în curs~12 min
Lecții din modul (1/2)

Expresii Lambda

Începând de la Java 8, programarea funcțională este acceptată prin Lambda Expressions. O expresie lambda este în esență o metodă anonimă (o funcție fără nume) care poate fi transmisă ca argument metodelor sau stocată în variabile.

Interfețe funcționale

O expresie lambda poate fi utilizată numai acolo unde este necesară o Interfață funcțională. O interfață funcțională este o interfață care declară exact o metodă abstractă. Java marchează aceste interfețe cu adnotarea opțională @FunctionalInterface.

Exemplu de interfață funcțională definită de utilizator:

Java
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

Înainte de Java 8, ar trebui să definiți o clasă interioară anonimă. Cu lambdas, sintaxa este simplificată la:

Java
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8

Structura expresiilor Lambda

Sintaxa de bază a unui lambda este:

Code
(parameters) -> { body }
  • Fără parametri: () -> System.out.println("Hello")
  • Parametru unic: x -> x * 2 (parantezele pot fi omise)
  • Parametri multipli: (x, y) -> x + y
  • Corps cu mai multe linii: dacă corpul conține mai multe instrucțiuni, sunt necesare acolade {} și o instrucțiune explicită return.
Java
MathOperation detailedAddition = (a, b) -> {
    System.out.println("Adding...");
    return a + b;
};

Interfețe funcționale standard în Java

Pachetul java.util.function oferă mai multe interfețe funcționale încorporate:

  • Predicate<T>: acceptă un argument de tip T și returnează un boolean (metoda test(T t)).
  • Consumer<T>: acceptă un argument de tip T și efectuează o operație fără a returna un rezultat (metoda accept(T t)).
  • Function<T, R>: acceptă un argument T și returnează un rezultat R (metoda apply(T t)).
  • Supplier<T>: nu acceptă argumente și returnează o valoare de tip T (metoda get()).

Încercați-l singur

Exercițiu#java.m7.l1.e1
Încercări: 0Se încarcă…

Completați codul prin instanțierea interfeței Calculator folosind o expresie lambda care adaugă două numere întregi. Apoi, invocați metoda de calcul trecând 5 și 3 și imprimați rezultatul.

Se încarcă editorul...
Afișează indiciu

Declarați `Calculator adder = (a, b) -> a + b;` și apoi invocați `adder.calculate(5, 3)` în apelul de tipărire.

Soluție disponibilă după 3 încercări

Exercițiu#java.m7.l1.e2
Încercări: 0Se încarcă…

Creați o instanță a interfeței funcționale standard Predicate<String> numită isLong folosind o expresie lambda care verifică dacă lungimea șirului este mai mare de 5 caractere. Apoi imprimați rezultatul testului pentru „hello world”.

Se încarcă editorul...
Afișează indiciu

Lambda pentru un `Predicate<String>` ia un parametru `s` și returnează `s.length() > 5` ca o condiție booleană.

Soluție disponibilă după 3 încercări

Exercițiu#java.m7.l1.e3
Încercări: 0Se încarcă…

Sortați lista de nume de șiruri de caractere alfabetic, invocând metoda sort() pe ea și trecând o expresie lambda care implementează Comparator (luând două șiruri s1, s2 și comparându-le folosind compareTo).

Se încarcă editorul...
Afișează indiciu

Utilizați `names.sort((s1, s2) -> s1.compareTo(s2));` pentru a sorta lista în loc.

Soluție disponibilă după 3 încercări