web-dev-qa-db-fra.com

Expression Lambda vs référence de la méthode

IntelliJ n'arrête pas de me proposer de remplacer mes expressions lambda par des références de méthodes.

Y a-t-il une différence objective entre les deux?

103
Gerard

Laissez-moi vous donner une idée de la raison pour laquelle nous avons ajouté cette fonctionnalité à la langue, alors que nous n’en avions clairement pas besoin (toutes les méthodes référées peuvent être exprimées en lambdas).

Notez qu'il y a pas de bonne réponse. Toute personne qui dit "utilise toujours une méthode ref au lieu d'un lambda" ou "utilise toujours un lambda au lieu d'une méthode ref" doit être ignorée.

Cette question est très similaire en esprit à "quand devrais-je utiliser une classe nommée par rapport à une classe anonyme"? Et la réponse est la même: quand vous le trouvez plus lisible. Il y a certainement des cas qui sont certainement l'un ou l'autre certainement, mais il y a une foule de gris au milieu, et le jugement doit être utilisé.

La théorie derrière la méthode refs est simple: les noms importent. Si une méthode a un nom, il est souvent (mais pas toujours!) Plus clair et lisible d'y faire référence nom par lieu, plutôt que par un sac de code impératif qui ne fait que tourner et l'invoque.

Les arguments sur les performances ou sur le comptage des caractères sont principalement des harengs rouges, et vous devriez les ignorer. Le but est d’écrire du code clair comme il se doit. Très souvent (mais pas toujours!) Les références de méthode gagnent sur cette métrique, nous les avons donc incluses en option, pour être utilisées dans ces cas-là.

Un élément clé à prendre en compte pour déterminer si les références de méthode clarifient ou obscurcissent l’intention est de déterminer s’il est évident, à partir du contexte, quelle est la forme de la fonction représentée. Dans certains cas (par exemple, map(Person::getLastName)], il ressort clairement du contexte qu'une fonction mappant une chose est requise et, dans ce cas, les références de méthode brillent. Dans d'autres cas, l'utilisation d'une méthode ref nécessite le lecteur peut se demander quel type de fonction est décrit: il s’agit d’un signe qu’un lambda pourrait être plus lisible, même s’il est plus long.

Enfin, ce que nous avons constaté, c’est que la plupart des gens au début s'éloignent des références de méthodes car ils se sentent encore plus récents et plus étranges que les lambdas, et les trouvent donc initialement "moins lisibles", mais avec le temps, quand ils s'habituent à la syntaxe, changent généralement de comportement et gravitent vers les références de méthodes quand ils le peuvent. Sachez donc que votre propre réaction subjective initiale "moins lisible" implique presque certainement un aspect de partialité familière et vous devez vous donner une chance de vous familiariser avec les deux avant de rendre un avis stylistique.

154
Brian Goetz

Les expressions lambda longues composées de plusieurs instructions peuvent réduire la lisibilité de votre code. Dans un tel cas, extraire ces instructions dans une méthode et la référencer peut être un meilleur choix.

L'autre raison peut être possibilité de réutilisation. Au lieu de copier-coller votre expression lambda de quelques instructions, vous pouvez construire une méthode et l'appeler à différents endroits de votre code.

10
ovunccetin