J'ai récemment maîtrisé l'expression Lambda introduite dans java 8. Je constate que chaque fois que j'utilise une interface fonctionnelle, j'ai tendance à toujours utiliser une expression Lambda au lieu de créer une classe qui implémente l'interface fonctionnelle.
Est-ce considéré comme une bonne pratique? Ou sont leurs situations où l'utilisation d'un Lambda pour une interface fonctionnelle n'est pas appropriée?
Réponses:
Un certain nombre de critères devraient vous inciter à ne pas utiliser de lambda:
priceIsOver100
.x -> x.price > 100
est tout aussi clair que ce nom. Je veux dire que des noms commeisEligibleVoter
celui-ci remplacent une longue liste de conditions.Ne va pas trop loin. Rappelez-vous, le logiciel est facilement modifié. En cas de doute, écrivez-le dans les deux sens et voyez ce qui est le plus facile à lire.
la source
Ça dépend. Lorsque vous utilisez le même lambda à différents endroits, vous devriez envisager de mettre en œuvre une classe qui implémente l'interface. Mais si vous aviez utilisé une classe interne anonyme, je pense qu'un lambda est bien meilleur.
la source
Je soutiens la réponse de Karl Bielefeldt, mais je souhaite ajouter un bref ajout.
la source
Accès aux variables locales de la portée englobante
La réponse acceptée par Karl Bielefeldt est correcte. Je peux ajouter une distinction supplémentaire:
Le code lambda imbriqué dans une méthode dans une classe peut accéder à toutes les variables finales trouvées dans cette méthode et cette classe.
Créer une classe qui implémente l'interface fonctionnelle ne vous donne pas un tel accès direct à l'état du code appelant.
Pour citer le tutoriel Java (l'emphase mienne):
Ainsi, s'il est avantageux d'extraire un code long et de le nommer, vous devez le comparer à la simplicité de l'accès direct à l'état de la méthode et de la classe englobantes.
Voir:
la source
C'est peut-être une énigme, mais à tous les autres excellents points soulevés dans d'autres réponses, j'ajouterais:
Préférez les références de méthode lorsque cela est possible. Comparer:
contre
L'utilisation d'une référence de méthode vous évite d'avoir à nommer le ou les arguments de lambda, qui sont généralement redondants et / ou conduisent à des noms paresseux tels que
e
oux
.la source
En se basant sur la réponse de Matt McHenry, il peut exister une relation entre lambda et les références de méthode, le lambda pouvant être réécrit sous la forme d'une série de références de méthodes. Par exemple:
contre
la source