Pourquoi le code suivant ne compile pas.
Consumer con = (s) -> System.out::println;
Ça dit
Le type cible de cette expression doit être une interface fonctionnelle
même si Consumer est une interface fonctionnelle. Ce qui suit fonctionne très bien.
Consumer con2 = (s) -> {System.out.println(s);};
Parce que c'est une référence de méthode, l'utilisation est un peu différente:
Consumer<String> c = System.out::println;
L'argument que le consommateur prend (s
) sera toujours passé à la méthode println
.
ici est le tutoriel d'Oracle à ce sujet.
Consumer con = (s) -> System.out::println;
Ici, vous essayez d'appeler la System.out.println()
avec ce que nous appelons référence de méthode dans Java 8. Quand vous faites référence à une méthode dans l'expression lambda son doit être comme ça,
Consumer con = System.out::println;
Vous n'avez pas réellement besoin de la méthode s
pour appeler la méthode println
. La référence de méthode s'en occupera. Cet opérateur ::
Signifie que vous appellerez la méthode println
avec un paramètre et que vous n'allez pas spécifier son nom.
Mais quand tu fais ça,
Consumer con2 = (s) -> {System.out.println(s);};
vous dites à l'expression lambda d'imprimer explicitement le contenu de s
qui est parfaitement bien techniquement afin qu'il ne se produise aucune erreur de compilation.