Les expressions Lambda ne change pas l'ensemble des problèmes que vous pouvez résoudre avec Java en général, mais certainement faire de résoudre certains des problèmes de plus facile, il suffit pour la même raison, nous ne sommes pas de la programmation en langage d'assemblage plus. Enlever les tâches redondantes à partir du programmeur de travail rend la vie plus facile et vous permet de faire des choses que vous n'auriez même pas le toucher sinon, juste pour la quantité de code, vous avez à produire (manuellement).
Mais les expressions lambda sont pas seulement économiser de lignes de code. Les expressions Lambda vous permettent de définir des fonctions, quelque chose pour laquelle vous pouvez utiliser les classes internes anonymes comme une solution de contournement avant, c'est pourquoi vous pouvez remplacer les classes internes anonymes dans ces cas, mais pas en général.
Plus particulièrement, les expressions lambda sont définies indépendamment de l'interface fonctionnelle, ils seront convertis, donc il n'y a pas hérité membres pourraient accéder, de plus, ils ne peuvent pas accéder à l'instance du type de mise en œuvre de l'interface fonctionnelle. Au sein d'une expression lambda, this
et super
ont la même signification que dans le contexte environnant, voir aussi cette réponse. Aussi, vous ne pouvez pas créer de nouvelles variables locales à l'occultation des variables locales du contexte environnant. Pour la tâche de définir une fonction, cela enlève beaucoup de sources d'erreur, mais cela signifie aussi que pour les autres cas, il peut être anonyme intérieur des classes qui ne peuvent pas être convertis à une expression lambda, même si la mise en œuvre d'une interface fonctionnelle.
En outre, la construction new Type() { … }
garanties pour produire une nouvelle distincte de l'instance (en tant que new
le fait toujours). Anonyme intérieur des instances de classe toujours garder une référence à leur extérieur de l'instance si elle est créée dans un non-static
contexte. En revanche, les expressions lambda capturer uniquement une référence à l' this
lorsque cela est nécessaire, c'est à dire si elles accèdent this
ou un non-static
membre. Et ils produisent des instances d'une intentionnellement quelconque identité, qui permet la mise en œuvre de décider au moment de l'exécution que de réutiliser les instances existantes (voir aussi "Ne une expression lambda de créer un objet sur le tas à chaque fois qu'il est exécuté?").
Ces différences s'appliquent à votre exemple. Votre anonyme intérieure de construire sera toujours de produire une nouvelle instance, il peut également capturer une référence à l'extérieur de l'instance, alors que votre (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())
est un non-capture d'une expression lambda, qui évaluent à un singleton dans typique des implémentations. De plus, il ne produit pas d' .class
le fichier sur votre disque dur.
Étant donné les différences en ce qui concerne à la fois, de la sémantique et de la performance, des expressions lambda peut changer la façon dont les programmeurs vont résoudre certains problèmes dans l'avenir, bien sûr, également en raison de la nouvelle Api d'embrasser les idées de la programmation fonctionnelle en utilisant les nouvelles fonctionnalités du langage. Voir aussi Java 8 lambda expression et des valeurs de première classe.