web-dev-qa-db-fra.com

Le type cible de cette expression doit être une interface fonctionnelle dans MethodReferences

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);};

13
HariJustForFun

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.

11
Eugene

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.

10
fluffyBatman