IntelliJ ne cesse 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?
java
intellij-idea
java-8
Gérard
la source
la source
Type[]::new
). La classe anonyme générée lors de l'exécution sera la même. Le JRE ne fait aucune différence entre eux. Donc, utiliser une référence de méthode vous fera économiser une méthode dans votre code compilé, d'un autre côté, vous ne pouvez pas vous arrêter à eux lorsque vous effectuez un débogage étape par étape…Réponses:
Permettez-moi de vous expliquer pourquoi nous avons ajouté cette fonctionnalité au langage, alors que nous n'en avions clairement pas besoin (toutes les méthodes refs peuvent être exprimées en lambdas.)
Notez qu'il n'y a pas de bonne réponse . Quiconque dit "toujours utiliser une méthode ref au lieu d'un lambda" ou "toujours utiliser un lambda au lieu d'une méthode ref" doit être ignoré.
Cette question est très similaire dans l'esprit à "quand dois-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 certainement l'autre, mais il y a une foule de gris au milieu, et le jugement doit être utilisé.
La théorie derrière les méthodes refs est simple: les noms comptent . Si une méthode a un nom, il est souvent (mais pas toujours!) Plus clair et lisible de s'y référer par son nom, plutôt que par un sac de code impératif qui, finalement, se retourne et l'invoque.
Les arguments sur les performances ou sur le comptage des caractères sont pour la plupart des harengs rouges, et vous devez les ignorer. Le but est d'écrire un code qui soit parfaitement clair. 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, à utiliser dans ces cas.
Une considération clé pour savoir si les références de méthode clarifient ou obscurcissent l'intention est de savoir s'il est évident du contexte quelle est la forme de la fonction représentée. Dans certains cas (par exemple, il est
map(Person::getLastName)
assez clair d'après le contexte qu'une fonction qui mappe une chose à une autre est requise, et dans des cas comme celui-ci, les références de méthode brillent. Dans d'autres, l'utilisation d'une méthode ref oblige le lecteur à se demander quel type de la fonction est en cours de description; c'est un signe d'avertissement qu'un lambda peut être plus lisible, même s'il est plus long.Enfin, ce que nous avons constaté, c'est que la plupart des gens s'éloignent d' abord des références de méthodes car ils se sentent encore plus récents et plus bizarres que les lambdas, et les trouvent donc initialement "moins lisibles", mais avec le temps, lorsqu'ils s'habituent à la syntaxe, changent généralement de comportement et se tournent vers les références de méthodes quand ils le peuvent. Soyez donc conscient que votre propre réaction subjective initiale «moins lisible» implique presque certainement un certain biais de familiarité, et vous devriez vous donner une chance de vous familiariser avec les deux avant de rendre une opinion stylistique.
la source
LiveData
, à l'intérieur d'unFragment
, que j'ai converti en unEvent
qui est déclenché par unViewModel
... et le comportement différent se produit lorsque Android revient au mêmeFragment
. .so j'ai du mal à le simplifier pour une questionLes expressions lambda longues constituées de plusieurs instructions peuvent réduire la lisibilité de votre code. Dans un tel cas, extraire ces instructions dans une méthode et y faire référence peut être un meilleur choix.
L'autre raison peut être la réutilisation . Au lieu de copier-coller votre expression lambda de quelques instructions, vous pouvez construire une méthode et l'appeler à partir de différents endroits de votre code.
la source
houses.map(House::getName)
ethouses.map(h -> h.getName())
. Le lambda prend deux caractères de moins. Il est vrai que le type n'est pas explicite, mais n'importe quel IDE vous le dirait, et de plus, les lambdas devraient être utilisés lorsque le type est évident. Je suis peut-être d'accord avec vous avec la réutilisabilité, mais les lambdas sont précisément minuscules afin de pouvoir être enchaînées au lieu de créer de grandes méthodes spécifiques. En ce sens, les petites méthodes sont plus réutilisables que certaines méthodes grandes et complexes, et en raison de la clarté de lambdas (et dans une certaine mesure, de la verbosité) elles sont toujours faciles à lire.House
est un exemple très bénin; qu'en est-ilThreeStoryRedBrickHouseWithBlueDoors
. Je préfère les références de méthode pour les lambdas à arguments multiples, et parfois pour souligner que le lambda ne concerne qu'un seul appel de méthode. Il y a moins de mal à se tromper avec une référence de méthode: vous pourriez mal orthographier l'argument au site d'utilisation, faire accidentellement référence à une variable de portée externe, etc.