Sobes.tech
Middle

Qu'est-ce que les expressions lambda en Java et quelles fonctionnalités offrent-elles?

sobes.tech IA

Réponse de l'IA

Les expressions lambda en Java sont une syntaxe concise pour créer des fonctions anonymes (méthodes sans nom) qui peuvent être passées en argument ou stockées dans des variables. Essentiellement, ce sont des interfaces fonctionnelles implémentées "à la volée".

Les principales fonctionnalités offertes par les expressions lambda :

  • Simplification de la syntaxe : Réduisent considérablement le code boilerplate lors de l'utilisation d'interfaces fonctionnelles par rapport aux classes internes anonymes.

    // Avant lambda :
    Runnable classicRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Runnable classique");
        }
    };
    
    // Avec lambda :
    Runnable lambdaRunnable = () -> System.out.println("Runnable lambda");
    
  • Programmation fonctionnelle : Permettent d'écrire un code plus fonctionnel, où les fonctions sont des citoyens de première classe et peuvent être passées comme données. C'est essentiel pour travailler avec l'API Stream.

    // Filtrage d'une liste avec lambda
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    List<String> filteredNames = names.stream()
                                     .filter(name -> name.startsWith("A"))
                                     .collect(Collectors.toList());
    
  • Travail avec l'API Stream : Les expressions lambda sont la base pour la plupart des opérations dans l'API Stream (filter, map, forEach, reduce, etc.), assurant concision et exécution parallèle.

    // Transformation et affichage des éléments du stream
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.stream()
           .map(n -> n * n) // lambda pour le mapping
           .forEach(System.out::println); // référence à une méthode (alternative à lambda)
    
  • Amélioration de la lisibilité : Pour des opérations simples, les lambdas rendent le code plus lisible et compréhensible, en se concentrant sur l'opération elle-même plutôt que sur la syntaxe de la classe anonyme.

  • Implémentation d'interfaces fonctionnelles : Peuvent être utilisées partout où une instance d'une interface fonctionnelle est attendue (interface avec une seule méthode abstraite).

Syntaxe de l'expression lambda : (paramètres) -> { corps }

Exemples :

  • Sans paramètres, sans valeur de retour : () -> System.out.println("Bonjour")
  • Avec un paramètre, sans valeur de retour : name -> System.out.println("Bonjour, " + name) (les parenthèses peuvent être omises autour d'un seul paramètre)
  • Avec plusieurs paramètres, sans valeur de retour : (x, y) -> System.out.println(x + y)
  • Avec paramètres, avec valeur de retour : (a, b) -> a + b (si le corps est une seule expression, sa valeur est renvoyée implicitement)
  • Avec paramètres, avec bloc de code et valeur de retour : (a, b) -> { int sum = a + b; return sum; } (un return explicite est requis pour les blocs de code)