Opérateur :: (double colon) en Java 8 : guide complet avec exemples

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

Opérateur :: (Double Colon) en Java 8 : du débutant au pro

\n\n

Avez-vous déjà écrit du code en Java 8 et vu une construction étrange comme System.out::println ou String::length ? Cela ressemble à de la magie, n'est-ce pas ? En réalité, ce n'est pas de la magie, mais l'un des outils les plus élégants du Java moderne — l'opérateur double colon (aussi appelé double colon operator ou référence de méthode).

\n\n

Dans cet article, nous allons décomposer l'opérateur :: des bases jusqu'aux techniques avancées. Vous apprendrez à écrire un code plus propre, plus concis et plus lisible. C'est parti !

\n\n

Qu'est-ce que l'opérateur :: et pourquoi en a-t-on besoin ?

\n\n

L'opérateur :: (double colon) a été introduit en Java 8 comme sucre syntaxique pour les expressions lambda. Si une expression lambda se contente d'appeler une méthode existante, vous pouvez la remplacer par une référence de méthode. Cela rend le code plus court et plus expressif.

\n\n

Comparez par vous-même :

\n\n
// Expression lambda\nlist.forEach(s -> System.out.println(s));\n\n// Référence de méthode (opérateur ::)\nlist.forEach(System.out::println);
\n\n

La deuxième option est non seulement plus courte, mais elle dit immédiatement : "Pour chaque élément, appelle la méthode println de System.out". Magnifique !

\n\n

Quatre types de références de méthode

\n\n

En Java 8, il existe quatre types principaux de method reference. Examinons chacun avec des exemples.

\n\n

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

\n\n

Syntaxe : ClassName::staticMethodName

\n\n

Exemple : compter le nombre de nombres pairs dans une liste.

\n\n
import java.util.Arrays;\nimport java.util.List;\n\npublic class StaticMethodReference {\n    public static boolean isEven(Integer number) {\n        return number % 2 == 0;\n    }\n\n    public static void main(String[] args) {\n        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);\n        \n        // Lambda\n        long countLambda = numbers.stream()\n                .filter(n -> StaticMethodReference.isEven(n))\n                .count();\n        \n        // Référence à une méthode statique\n        long countRef = numbers.stream()\n                .filter(StaticMethodReference::isEven)\n                .count();\n        \n        System.out.println("Nombre de nombres pairs : " + countRef); // 3\n    }\n}
\n\n

Notez bien : nous n'appelons pas la méthode isEven — nous passons simplement une référence à celle-ci. Java se charge elle-même de substituer chaque élément de la liste comme argument.

\n\n

2. Référence à une méthode d'instance d'un objet spécifique

\n\n

Syntaxe : objectReference::instanceMethodName

\n\n

Ce type est utilisé lorsque vous avez déjà un objet spécifique et que vous souhaitez appeler sa méthode.

\n\n
import java.util.Arrays;\nimport java.util.List;\n\npublic class InstanceMethodReference {\n    public static void main(String[] args) {\n        List<String> names = Arrays.asList("Anna", "Boris", "Victor");\n        \n        // Création d'un objet StringBuilder\n        StringBuilder sb = new StringBuilder("Noms : ");\n        \n        // Lambda\n        names.forEach(name -> sb.append(name).append(" "));\n        \n        // Référence à une méthode d'instance\n        // (mais append retourne StringBuilder, donc on utilise une lambda)\n        // Par contre pour System.out.println - c'est parfait :\n        names.forEach(System.out::println);\n        \n        System.out.println(sb.toString()); // Noms : Anna Boris Victor\n    }\n}
\n\n

L'exemple classique est System.out::println. System.out est un objet spécifique de PrintStream, et println est sa méthode.

\n\n

3. Référence à une méthode d'instance d'un objet arbitraire d'un type spécifique

\n\n

Syntaxe : ClassName::instanceMethodName

\n\n

Ce type est souvent confondu avec le précédent. Ici, nous ne spécifions pas d'objet concret — nous disons plutôt : "Prends n'importe quel objet de cette classe et appelle sa méthode".

\n\n


                
                

Blogs

Book Recommendations