Expression Lambda vs méthode de référence
IntelliJ conserve propose de me remplacer mes expressions lambda avec la méthode de référence.
Est-il un objectif de différence entre les deux?
- C'est juste la même choses, MAIS ne trouvez-vous pas quelque chose de beau comme
files.stream().map(File::getName)
? - Pas vraiment, je ne vois pas de n'importe quel objet! Il ressemble à un appel statique pour moi
- "on dirait que" n'est pas un argument, je crois.
- Bien sûr! Mais "vous ne trouvez pas" non plus... C'est une question de goût, j'étais plus inquiet au sujet des aspects plus techniques. En fait, comme vous l'avez déjà dit qu'ils sont les mêmes, c'est une bonne réponse pour moi. De toute façon, comme IntelliJ le propose, je pense qu'il est généralement plus apprécié de voir une référence à une méthode qu'un lambda (pas pour moi, tout de même).
- Je suppose que l'aide
lambda
est un peu plus de frais généraux pour la création de la lambda (anonyme en fonction de la classe et d'instance) et de l'appeler. Mais de toute façon si vous voulez juste de faire appel à une sortie de la méthode, j'irais avec la méthode de pointeur, trop. C'est juste plus propre. Si vous utilisez lambda, vous avez juste à visuellement analyser l'expression de vérifier si il n'y a peut-être un-
cachés ou des trucs. - J'avais parier que java fait la même chose avec la méthode de référence.
- Il semble donc que la seule discussion à propos de la syntaxe, et qui semble plutôt subjective (avec quelques exceptions).
- La surcharge de l'un ou l'autre est un détail d'implémentation, et est lié à être très variable, en tendant vers zéro, comme le soutien de lambda évolue dans le HotSpot.
- Le code d'une expression lambda est compilé pour une méthode synthétique, tandis que la méthode références de travail sans (à l'exception des constructions spéciales comme
Type[]::new
). La classe anonyme généré lors de l'exécution sera la même. Le JRE ne pas faire de différence entre eux. Donc, en utilisant une méthode de référence, vous fera économiser une méthode dans le code compilé, d'autre part, vous ne pouvez pas vous arrêter chez eux lorsque cette étape-par-étape de débogage... - Maintenant, la question va être fermé... dommage pour tous les utilisateurs comme moi qui ne savent pas la différence entre les lambdas et des références, même si il n'y a pas tout qui est décisive. Je me demande aussi pourquoi personne n'a osé répondre à cela? C'est la bonne réponse pour moi.
- Répondant à l'âge de deux ans question fermée est probablement une mauvaise idée, mais pour ceux qui ont LU la question, c'est ce que l'Oracle tutoriel (docs.oracle.com/javase/tutorial/java/javaOO/...) dit: Méthode de références ... sont compact, facile à lire les expressions lambda, pour les méthodes qui ont déjà un nom.
- Eh bien, je suis un peu surpris que personne n'a mentionné cette différence MAJEURE: l'expression
setCallback(object::method);
jette NPE siobject == null
, maissetCallback(() -> object.method());
ne pas! - Quelques mots semblent manquants de votre commentaire. Pouvez-vous élaborer sur la façon dont chacun est compilé et ensuite l'exécuter ? Si elles sont de la même (ou presque) dans la performance, je serais normalement ont tendance à aller pour une méthode de référence, comme le code de l'instruction le but est plus clair.
- le format d'un commentaire n'est pas suffisante pour décrire les détails (plus que mon commentaire précédent est déjà fait). Vous pouvez la lire ceci et ça, si vous êtes intéressé par plus de détails. Mais la vente à emporter concernant votre question est simple: il n'y a pas de différence significative, si vous préférez la méthode de références, d'aller pour elle. Il suffit de ne pas essayer de plier le code à utiliser excessivement, c'est à dire quand une lambda est beaucoup plus simple, ne pas rester à l'écart de l'utiliser.
Vous devez vous connecter pour publier un commentaire.
Laissez-moi vous donner un peu de perspective sur pourquoi nous avons ajouté cette fonctionnalité à la langue, alors qu'il est clair que nous n'avons pas strictement besoin pour (toutes les méthodes de refs peut être exprimée comme les lambdas.)
Remarque qu'il y a pas de bonne réponse. Quelqu'un qui dit "toujours utiliser une méthode de ref au lieu d'un lambda" ou "toujours utiliser une lambda au lieu d'une méthode de ref" doit être ignorée.
Cette question est très similaire dans l'esprit à "quand dois-je utiliser une classe nommée vs une classe anonyme"? Et la réponse est la même: lorsque vous trouvez qu'il est plus lisible. Il y a certainement des cas qui sont certainement l'un ou définitivement, de l'autre, mais il y a une multitude de gris au milieu, et le jugement doit être utilisé.
La théorie derrière méthode refs est simple: noms de matière. Si une méthode a un nom, puis se référant à elle par son nom plutôt que par un impératif sac de code qui finalement tourne juste autour et l'appelle, est souvent (mais pas toujours!) plus claire et plus lisible.
Les arguments sur la performance ou sur le décompte des personnages sont pour la plupart des fausses pistes, et vous devez les ignorer. Le but est d'écrire du code qui est tout à fait clair ce qu'il fait. Très souvent (mais pas toujours!) méthode refs gagner sur cette métrique, nous avons donc inclus en option, pour être utilisé dans ces cas.
Un facteur clé de savoir si la méthode refs éclaircir ou obscurcir l'intention est de savoir 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)
, son tout à fait clair d'après le contexte qu'une fonction qui cartes une chose à l'autre est nécessaire, et dans ce cas, la méthode références de l'éclat. Dans d'autres, à l'aide d'une méthode ref oblige le lecteur à s'interroger sur ce type de fonction est décrite; c'est un signe d'avertissement qu'un lambda peut être plus lisible, même si elle est plus longue.Enfin, ce que nous avons trouvé est que la plupart des gens au premier à se détourner de la méthode refs parce qu'ils se sentent, même les plus récents et les plus étranges que les lambdas, et donc, au départ, les trouver moins "lisible", mais au fil du temps, quand ils s'habituer à la syntaxe, généralement à changer leur comportement et attirés par la méthode des références quand ils le peuvent. Alors, soyez conscient que votre propre subjective initiale "moins lisible" réaction presque certainement comporte certains aspects de familarity biais, et vous devez vous donner une chance d'obtenir à l'aise avec les deux, avant de rendre une stylistique de l'opinion.
LiveData
, à l'intérieur d'unFragment
, que j'ai converti enEvent
qui est déclenché par unViewModel
...et la différence de comportement se produit lorsque Android revient à la mêmeFragment
...donc je vais avoir du mal à le simplifier pour une questionLong des expressions lambda, composé de plusieurs états peuvent réduire la lisibilité de votre code. Dans un tel cas, l'extraction de ces déclarations dans une méthode et de référencement, il peut être un meilleur choix.
L'autre raison est peut-être ré-utilisabilité. Au lieu de copier les&coller votre expression lambda de quelques déclarations, vous pouvez construire une méthode et de l'appeler à partir de différents endroits de votre code.
houses.map(House::getName)
ethouses.map(h -> h.getName())
. Le lambda prend moins deux caractères. Il est vrai que le type n'est pas explicite, mais aucune IDE serait de vous dire, et d'ailleurs, elles devraient être utilisé quand le type est évident. Je pourrais d'accord avec vous avec la possibilité de réutilisation, mais lambdas sont précisément minuscule, donc ils peuvent être enchaînés au lieu de créer de gros des méthodes spécifiques. En ce sens, les petites méthodes sont plus réutilisables que quelques grands et complexes de la méthode, et en raison des lambdas de clarté (et un certain degré, le niveau de verbosité) ils sont toujours faciles à lire.House
est un très bon exemple; qu'enThreeStoryRedBrickHouseWithBlueDoors
. Je préfère la méthode des références pour de multiples argument lambdas, et parfois à souligner que le lambda est seulement sur un seul appel de méthode. Il y a moins de se tromper avec une méthode de référence: vous pouvez épeler l'argument à l'utilisation du site, accidentellement référence à une variable de l'extérieur de la portée, etc.