Lambdas & interfaces fonctionnelles
Une lambda est une fonction anonyme concise. Elle implémente une interface fonctionnelle (une seule méthode abstraite).
Predicate<Commande> grosse = c -> c.getLitres() >= 2000; Function<Commande, Integer> vol = Commande::getLitres; // référence de méthode Runnable r = () -> System.out.println("clôture");
Les Streams
Un Stream enchaîne des opérations (filter, map, reduce, collect) sur une collection, sans boucle explicite.
int total = commandes.stream()
.filter(c -> c.getStatut() == Statut.CONFIRMEE)
.mapToInt(Commande::getLitres)
.sum();
List<String> noms = participants.stream()
.map(Participant::getNom)
.sorted()
.toList();
Déclaratif — on décrit quoi faire, pas comment boucler. Le même calcul qu'au chapitre 3 (cumul du volume), en une expression.
🛢️ Sur le projet Fioul Groupé
Le volume total confirmé d'une campagne : commandes.stream().filter(...).mapToInt(Commande::getLitres).sum(). C'est la version Java de l'agrégation SQL SUM(litres) et du $group MongoDB — trois écritures d'un même calcul métier, au cœur du projet.
À retenir
- Une lambda implémente une interface fonctionnelle (1 méthode).
- Predicate, Function, Consumer, Supplier : les interfaces clés.
- Stream : filter/map/reduce/collect, style déclaratif sans boucle.
- Fil rouge : SUM(litres) devient un Stream en une ligne.