Programmation fonctionnelle en Java : des lambdas au Stream API

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Programmation fonctionnelle en Java : des lambdas au Stream API



La programmation fonctionnelle (PF) est un paradigme dans lequel les calculs sont représentés comme le calcul de fonctions mathématiques, en évitant les changements d'état et la mutation des données. Pendant longtemps, Java est resté un langage strictement orienté objet, mais avec la sortie de Java 8 (2014), il a fait un pas de géant vers la PF en ajoutant les expressions lambda, les interfaces fonctionnelles et le Stream API. Aujourd'hui, ces outils sont indispensables pour écrire un code concis, lisible et thread-safe.



Dans cet article, nous allons décomposer les concepts clés de la programmation fonctionnelle en Java : des bases des lambdas au traitement avancé des collections avec le Stream API. Le contenu est destiné aux développeurs qui connaissent déjà la syntaxe de base de Java, mais qui souhaitent maîtriser les approches modernes.



1. Expressions lambda et interfaces fonctionnelles



Une expression lambda est une fonction anonyme (une méthode sans nom) qui peut être passée comme argument ou stockée dans une variable. En Java, une lambda implémente une interface fonctionnelle — une interface avec exactement une méthode abstraite (SAM — Single Abstract Method).



Syntaxe :

(paramètres) -> { corps }


Exemple : au lieu de créer une classe anonyme pour un comparateur :

// Ancienne méthode (Java 7)Comparator<String> comparator = new Comparator<String>() {    @Override    public int compare(String s1, String s2) {        return s1.length() - s2.length();    }};

// Nouvelle méthode (Java 8+)Comparator<String> comparatorLambda = (s1, s2) -> s1.length() - s2.length();


Interfaces fonctionnelles principales en Java (package java.util.function) :

  • Predicate<T> — vérifie une condition (méthode test).
  • Function<T, R> — transforme un objet de type T en R (méthode apply).
  • Consumer<T> — effectue une action sur un objet (méthode accept).
  • Supplier<T> — fournit un objet sans paramètres d'entrée (méthode get).


Exemple avec Predicate :

Predicate<Integer> isEven = n -> n % 2 == 0;System.out.println(isEven.test(4)); // trueSystem.out.println(isEven.test(5)); // false


Références de méthode (Method References) — c'est une notation abrégée pour une lambda lorsque le corps consiste en un seul appel de méthode :

// Lambdalist.forEach(item -> System.out.println(item));// Référence de méthodelist.forEach(System.out::println);


2. Stream API : opérations de base



Le Stream API est un outil puissant pour traiter des séquences de données (collections, tableaux, fichiers) dans un style déclaratif. Un Stream ne stocke pas les données, il décrit seulement un pipeline d'opérations. Les données ne sont pas modifiées — chaque étape crée un nouveau stream.



Création d'un stream :

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");Stream<String> stream = names.stream(); // séquentielStream<String> parallelStream = names.parallelStream(); // parallèle


Opérations intermédiaires (retournent un nouveau Stream) :

  • filter(Predicate) — sélectionne les éléments selon une condition.
  • map(Function) — transforme chaque élément.
  • sorted() / sorted(Comparator) — tri.
  • distinct() — supprime les doublons.
  • limit(n) — limite le nombre d'éléments.


Opérations terminales (terminent le stream, retournent un résultat) :

  • collect(Collectors.toList()) — rassemble dans une collection.
  • forEach(Con

Blogs

Book Recommendations