Opérateur :: (Double Colon) en Java 8 : du débutant au pro
\n\nAvez-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).
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 !
Qu'est-ce que l'opérateur :: et pourquoi en a-t-on besoin ?
\n\nL'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.
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\nLa 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\nQuatre types de références de méthode
\n\nEn Java 8, il existe quatre types principaux de method reference. Examinons chacun avec des exemples.
\n\n1. Référence à une méthode statique
\n\nSyntaxe : ClassName::staticMethodName
Exemple : compter le nombre de nombres pairs dans une liste.
\n\nimport 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\nNotez 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.
2. Référence à une méthode d'instance d'un objet spécifique
\n\nSyntaxe : objectReference::instanceMethodName
Ce type est utilisé lorsque vous avez déjà un objet spécifique et que vous souhaitez appeler sa méthode.
\n\nimport 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\nL'exemple classique est System.out::println. System.out est un objet spécifique de PrintStream, et println est sa méthode.
3. Référence à une méthode d'instance d'un objet arbitraire d'un type spécifique
\n\nSyntaxe : ClassName::instanceMethodName
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\nBlogs
Book Recommendations
Lire aussi
Comment écrire une API REST en PHP en 30 minutes : guide pas à pas pour débutants
Opérations mathématiques en Python : addition, division, modulo, racines et puissances
Journalisation dans les applications Java : meilleures pratiques pour débutants
Optimisation des performances des applications Kotlin : conseils pratiques
Workflow Git pour les développeurs Rust : du premier commit à la revue de code