Question Expression Lambda vs référence de méthode [fermé]


IntelliJ continue de me proposer de remplacer mes expressions lambda par des références de méthode.

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


71
2018-06-30 10:14


origine


Réponses:


Cette question sera probablement (et devrait) être essentiellement arrêtée par des opinions. Mais, avant que cela ne se produise, laissez-moi vous donner une idée de la raison pour laquelle nous avons ajouté cette fonctionnalité au langage, alors que clairement, nous n’en avions pas absolument besoin (toutes les méthodes peuvent être exprimées en lambda).

Notez qu'il y a pas de bonne réponse. Quiconque dit "utilise toujours une méthode ref au lieu d'un lambda" ou "utilise toujours un lambda à la place d'une méthode ref" doit être ignoré.

Cette question est très similaire dans l'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 définitivement l'un ou l'autre, 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 comptent. Si une méthode a un nom, s'y référer par son nom, plutôt que par un sac de code impératif qui ne fait que se retourner et l'invoquer, est souvent (mais pas toujours!) Plus clair et plus lisible.

Les arguments concernant les performances ou le comptage des caractères sont principalement des herrings rouges, et vous devriez les ignorer. Le but est d’écrire un code clair et clair sur ce qu’il fait. Très souvent (mais pas toujours!), Les refs de méthodes gagnent sur cette métrique, nous les avons donc incluses comme une option, à utiliser dans ces cas.

Une considération clé quant à savoir si la méthode clarifie ou obscurcit l'intention est de savoir s'il est évident d'après le contexte quelle est la forme de la fonction représentée. Dans certains cas (par exemple, map(Person::getLastName), il est tout à fait clair dans le contexte qu'une fonction qui mappe une chose à une autre est nécessaire, et dans de tels cas, les références de méthode brillent. Dans d'autres, l'utilisation d'une méthode de référence nécessite que le lecteur s'interroge sur le type de fonction décrit. c'est un signe d'avertissement qu'un lambda peut être plus lisible, même si c'est plus long.

Enfin, ce que nous avons trouvé est que la plupart des gens en premier s'éloigner des refs de méthode car elles se sentent encore plus nouvelles et plus étranges que lambdas, et les trouvent donc initialement moins "lisibles", mais avec le temps, quand elles s'habituent à la syntaxe, elles modifient généralement leur comportement et Donc, soyez conscient que votre propre réaction subjective "moins lisible" implique presque certainement un certain biais de la familiarité, et vous devriez vous donner une chance de vous familiariser avec les deux avant de donner une opinion stylistique.


103
2018-06-30 15:39



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

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


7
2018-06-30 10:29