Passer au contenu principal
eLearner.app
Module 7 · Leçon 1 sur 213/14 dans le cours~12 min
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 :

Code
@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 à :

Code
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 :

Code
(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'instruction return explicite sont nécessaires.
Code
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 type T et renvoie un booléen (méthode test(T t)).
  • Consumer<T> : accepte un argument de type T et effectue une opération sans rien renvoyer (méthode accept(T t)).
  • Function<T, R> : accepte un argument T et renvoie un résultat R (metodo apply(T t)).
  • Supplier<T> : n'accepte aucun argument et renvoie une valeur T (méthode get()).

À toi de jouer

Exercice#java.m7.l1.e1
Tentatives : 0Chargement…

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.

Chargement de l'éditeur…
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

Exercice#java.m7.l1.e2
Tentatives : 0Chargement…

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'.

Chargement de l'éditeur…
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

Exercice#java.m7.l1.e3
Tentatives : 0Chargement…

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).

Chargement de l'éditeur…
Afficher l'indice

Utilisez `names.sort((s1, s2) -> s1.compareTo(s2));` pour trier la liste sur place.

Solution disponible après 3 tentatives