Leçons du module (1/2)
Expressions Lambda
À partir de Java 8, le support de la programmation fonctionnelle a été introduit grâce aux Expressions Lambda. Une lambda est essentiellement une méthode anonyme (une fonction sans nom) qui peut être passée comme argument à des méthodes ou stockée dans des variables.
Les Interfaces Fonctionnelles
Une expression lambda ne peut être utilisée que là où une Interface Fonctionnelle (Functional Interface) est requise. Il s'agit d'une interface qui déclare une seule méthode abstraite. Java marque ces interfaces avec l'annotation optionnelle @FunctionalInterface.
Exemple d'interface fonctionnelle définie par l'utilisateur :
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}
Avant Java 8, nous aurions dû définir une classe anonyme. Avec les lambdas, la syntaxe est réduite à :
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Ritorna 8
Structure des Expressions Lambda
La syntaxe de base d'une lambda est :
(parametri) -> { corpo }
- Sans paramètres :
() -> System.out.println("Hello") - Paramètre unique :
x -> x * 2(les parenthèses peuvent être omises) - Plusieurs paramètres :
(x, y) -> x + y - Corps multi-lignes : si le corps contient plusieurs instructions, les accolades
{}et l'instructionreturnexplicite sont nécessaires.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Somma in corso...");
return a + b;
};
Interfaces Fonctionnelles Standards en Java
Le paquet java.util.function fournit de nombreuses interfaces fonctionnelles prédéfinies :
Predicate<T>: accepte un argument de typeTet renvoie un booléen (méthodetest(T t)).Consumer<T>: accepte un argument de typeTet effectue une opération sans rien renvoyer (méthodeaccept(T t)).Function<T, R>: accepte un argumentTet renvoie un résultatR(metodoapply(T t)).Supplier<T>: n'accepte aucun argument et renvoie une valeurT(méthodeget()).
À toi de jouer
Complétez le code en instanciant l'interface Calculator via une expression lambda qui additionne deux entiers. Ensuite, appelez la méthode calculate en passant 5 et 3 et affichez le résultat à l'écran.
Afficher l'indice
Déclarez `Calculator adder = (a, b) -> a + b;` puis appelez `adder.calculate(5, 3)` à l'intérieur de l'affichage.
Solution disponible après 3 tentatives
Créez une instance de l'interface fonctionnelle standard Predicate<String> nommée isLong en utilisant une lambda qui vérifie si la longueur de la chaîne est supérieure à 5 caractères. Affichez ensuite le résultat du test pour la chaîne 'hello world'.
Afficher l'indice
La lambda pour un `Predicate<String>` prend un paramètre `s` et renvoie `s.length() > 5` comme condition booléenne.
Solution disponible après 3 tentatives
Triez par ordre alphabétique la liste de chaînes names en appelant la méthode sort() sur celle-ci et en lui passant une expression lambda qui implémente Comparator (prenant deux chaînes s1, s2 et les comparant à l'aide de compareTo).
Afficher l'indice
Utilisez `names.sort((s1, s2) -> s1.compareTo(s2));` pour trier la liste sur place.
Solution disponible après 3 tentatives