Aller au contenu principal

Références de méthodes

Une référence de méthode est une syntaxe raccourcie pour une lambda qui ne fait qu'appeler une méthode existante. Quand une lambda se résume à x -> foo(x), on peut l'écrire Classe::foo.

Les références de méthodes sont particulièrement courantes avec les Streams (Cours 06).

Syntaxe générale

Référence Équivalent lambda
───────────────── ──────────────────────────────
Classe::méthode (x) -> Classe.méthode(x) // statique
instance::méthode (x) -> instance.méthode(x) // instance existante
Classe::méthode (x) -> x.méthode() // méthode de l'instance reçue
Classe::new (x) -> new Classe(x) // constructeur

1. Référence à une méthode statique

La méthode référencée est static — elle appartient à la classe, pas à un objet.

import java.util.List;

public class RefStatique {
public static void afficher(String s) {
System.out.println(s);
}

public static void main(String[] args) {
List<String> noms = List.of("Alice", "Bob", "Clara");

// Lambda équivalente : s -> afficher(s)
noms.forEach(RefStatique::afficher);
}
}

Integer::parseInt — passer la méthode comme Function<String, Integer> :

import java.util.function.Function;

Function<String, Integer> convertir = Integer::parseInt;
// Lambda équivalente : s -> Integer.parseInt(s)

System.out.println(convertir.apply("42")); // 42
System.out.println(convertir.apply("7")); // 7

Math::abs — passer la méthode comme Function<Integer, Integer> :

import java.util.function.Function;

Function<Integer, Integer> valeurAbsolue = Math::abs;
// Lambda équivalente : n -> Math.abs(n)

System.out.println(valeurAbsolue.apply(-5)); // 5
System.out.println(valeurAbsolue.apply(3)); // 3

2. Référence à une méthode d'une instance existante

La méthode est appelée sur un objet déjà créé avant la référence.

import java.util.List;

public class RefInstance {
public static void main(String[] args) {
List<String> noms = List.of("Alice", "Bob", "Clara");

// Lambda équivalente : s -> System.out.println(s)
noms.forEach(System.out::println);
}
}

Avec un objet créé soi-même — accumuler dans un StringBuilder existant :

import java.util.List;

List<String> mots = List.of("Java", " ", "est", " ", "cool");
StringBuilder sb = new StringBuilder();

// Lambda équivalente : s -> sb.append(s)
mots.forEach(sb::append);

System.out.println(sb.toString()); // Java est cool

3. Référence à une méthode de l'instance reçue

Ici, la méthode est appelée sur l'objet passé en paramètre, pas sur une instance externe.

import java.util.function.Function;

Function<String, String> majuscules = String::toUpperCase;
// Lambda équivalente : s -> s.toUpperCase()

System.out.println(majuscules.apply("alice")); // ALICE
System.out.println(majuscules.apply("bob")); // BOB

String::length — obtenir la longueur d'un mot :

import java.util.function.Function;

Function<String, Integer> longueur = String::length;
// Lambda équivalente : s -> s.length()

System.out.println(longueur.apply("chat")); // 4
System.out.println(longueur.apply("éléphant")); // 8

String::isEmpty — tester si une chaîne est vide :

import java.util.function.Predicate;

Predicate<String> estVide = String::isEmpty;
// Lambda équivalente : s -> s.isEmpty()

System.out.println(estVide.test("")); // true
System.out.println(estVide.test("bonjour")); // false

4. Référence à un constructeur

StringBuilder::new — créer un StringBuilder à partir d'une String :

import java.util.function.Function;

Function<String, StringBuilder> creer = StringBuilder::new;
// Lambda équivalente : s -> new StringBuilder(s)

StringBuilder sb = creer.apply("Bonjour");
System.out.println(sb); // Bonjour

Supplier — créer un objet sans argument :

import java.util.ArrayList;
import java.util.function.Supplier;

Supplier<ArrayList<String>> nouvelleListeVide = ArrayList::new;
// Lambda équivalente : () -> new ArrayList<>()

ArrayList<String> liste = nouvelleListeVide.get();
liste.add("Alice");
System.out.println(liste); // [Alice]

Résumé

FormeQuand l'utiliser
Classe::méthodeStatiqueLa méthode ne dépend pas d'une instance
instance::méthodeOn a déjà l'objet cible (ex: System.out)
Classe::méthodeInstanceLa méthode est appelée sur l'argument reçu
Classe::newOn veut créer un objet à partir de l'argument

Une référence de méthode n'est utilisable que là où une interface fonctionnelle est attendue — exactement comme une lambda.