Les références aux méthodes ignorent-elles les frais généraux du wrapper lambda? Pourraient-ils dans le futur?
Selon le tutoriel Java sur les références de méthode :
Parfois ... une expression lambda ne fait qu'appeler une méthode existante. Dans ces cas, il est souvent plus clair de faire référence à la méthode existante par son nom. Les références de méthode vous permettent de le faire; Ce sont des expressions lambda compactes et faciles à lire pour les méthodes qui ont déjà un nom.
Je préfère la syntaxe lambda à la syntaxe de référence de la méthode pour plusieurs raisons:
Lambdas sont plus claires
Malgré les affirmations d'Oracle, je trouve la syntaxe lambda plus facile à lire que la référence à la méthode de référence de l'objet car la syntaxe de référence de la méthode est ambiguë:
Bar::foo
Appelez-vous une méthode statique à un argument sur la classe de x et transmettez-vous x?
x -> Bar.foo(x)
Ou appelez-vous une méthode d'instance à zéro argument sur x?
x -> x.foo()
La syntaxe de référence de la méthode peut remplacer l'un ou l'autre. Il cache ce que votre code est en train de faire.
Lambdas sont plus sûrs
Si vous faites référence à Bar :: foo en tant que méthode de classe et que Bar ajoute ultérieurement une méthode d'instance du même nom (ou inversement), votre code ne sera plus compilé.
Vous pouvez utiliser des lambdas de manière constante
Vous pouvez envelopper n'importe quelle fonction dans un lambda - afin que vous puissiez utiliser la même syntaxe partout. La syntaxe de référence de méthode ne fonctionne pas avec les méthodes qui prennent ou renvoient des tableaux primitifs, lèvent des exceptions vérifiées ou ont le même nom de méthode utilisé comme instance et une méthode statique (car la syntaxe de référence de méthode est ambiguë quant à la méthode à appeler) . Ils ne fonctionnent pas lorsque vous avez surchargé des méthodes avec le même nombre d'arguments, mais vous ne devriez pas le faire de toute façon (voir le point 41 de Josh Bloch), nous ne pouvons donc pas en tenir autant aux références à des méthodes.
Conclusion
Si cela ne nuit pas aux performances, je suis tenté de désactiver l'avertissement dans mon IDE et d'utiliser la syntaxe lambda de manière cohérente sans saupoudrer la référence de méthode occasionnelle dans mon code.
PS
Ni ici ni là-bas, mais dans mes rêves, les références de méthode d'objet ressemblent davantage à ceci et appliquent invoke-dynamic à la méthode directement sur l'objet sans wrapper lambda:
_.foo()
.map(_.acceptValue())
: Si je ne me trompe pas, cela ressemble beaucoup à la syntaxe Scala. Peut-être que vous essayez simplement d'utiliser le mauvais langage.
System.out::println
à forEach()
tout le temps ...?