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:
@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:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8Structura expresiilor Lambda
Sintaxa de bază a unui lambda este:
(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.
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 tipTși returnează un boolean (metodatest(T t)).Consumer<T>: acceptă un argument de tipTși efectuează o operație fără a returna un rezultat (metodaaccept(T t)).Function<T, R>: acceptă un argumentTși returnează un rezultatR(metodaapply(T t)).Supplier<T>: nu acceptă argumente și returnează o valoare de tipT(metodaget()).
Încercați-l singur
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.
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
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”.
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
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).
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