Lambda Expression et la Variable de Capture
S'il vous plaît expliquez-moi comment une expression lambda pouvez utiliser et modifier les variables d'instance de sa classe englobante, mais ne peut utiliser les variables de son cadre englobant. (Sauf si c'est définitif ou final?)
Ma question de base est la façon dont les variables d'instance d'une classe sont modifiables à partir de l'intérieur d'un lambda et les variables locales ne sont pas, dans le contexte de la portée.
Depuis lambda est effectivement un anonyme intérieur de la classe, c'est un double possible de Pourquoi ne sont définitives que les variables accessibles dans la classe anonyme?
Cela est vrai pour Java 8, mais autant que je sache, il n'est pas spécifié, ce qui pourrait être changé dans les futures versions de Java.
seulement
Je pense qu'il est spécifié et qu'il ne changera pas dans l'avenir. voir ces commentaires.
Alors que je suis sûr que j'ai lu un post de blog ou quelque chose de tout à l'heure, qui a déclaré Lambdas au moment où sont compilées les Classes internes Anonymes, mais que cela pourrait changer pour des raisons de performances dans l'avenir, je ne suis pas en mesure de trouver cet article. Alors peut-être que vous avez raison - même si elle n'a pas été précisé, à l'instant où son effet de la même.
Cela est vrai pour Java 8, mais autant que je sache, il n'est pas spécifié, ce qui pourrait être changé dans les futures versions de Java.
seulement
this
est capturé. tous l'accès à une variable d'instance dans le corps de lambda est fait par le biais de this.field
, donc vous pouvez écrire à trop.Je pense qu'il est spécifié et qu'il ne changera pas dans l'avenir. voir ces commentaires.
Alors que je suis sûr que j'ai lu un post de blog ou quelque chose de tout à l'heure, qui a déclaré Lambdas au moment où sont compilées les Classes internes Anonymes, mais que cela pourrait changer pour des raisons de performances dans l'avenir, je ne suis pas en mesure de trouver cet article. Alors peut-être que vous avez raison - même si elle n'a pas été précisé, à l'instant où son effet de la même.
OriginalL'auteur Abu Bakkar Siddique | 2015-08-28
Vous devez vous connecter pour publier un commentaire.
Au premier abord, nous pouvons jeter un oeil à la JLS, qui stipule ce qui suit:
Pour mieux la comprendre, jetez un oeil à cet exemple de classe:
Sortie de la principale est
C'est parce que le renvoi d'un lambda ici est la même que la création d'une nouvelle classe anonyme avec
new Consumer<String>() {...}
. Votre lambda - une instance deConsumer<String>
a une référence à la classe à laquelle il a été créé en. Vous pouvez réécrire le returnConsumerWithInstanceVariable à utiliserSystem.out.println(s + LambdaTest.this.string)
, ce serait faire exactement la même chose. C'est pourquoi vous êtes autorisé à accéder (et modifier) les variables d'instance.Si vous avez un (effectif) en finale de la variable locale dans votre méthode, vous pouvez y accéder parce que vous pouvez y accéder parce que c'est copié sur votre lambda instance.
Mais, cependant, si elle n'est pas définitive, qu'en pensez-vous devrait se faire dans le contexte suivant:
La valeur doit-elle être copiés sur votre instance, mais alors pas mise à jour lorsque la variable locale est mis à jour? Ce serait sans doute causer de la confusion, je pense que beaucoup de programmeurs serait attendu foo pour la nouvelle valeur de "a vous tous," après son retour cette lambda.
Si vous aviez une valeur primitive, il permettrait de poser sur la pile. Ainsi vous ne pourriez pas simplement référence à la variable locale, parce qu'elle pourrait disparaître après la fin de votre méthode est atteint.
OriginalL'auteur Alex
Vous pouvez consulter cet article - https://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood expliqué sur les expressions lambda compilation. Comme l'explique les expressions lambda/blocs de code sont compilés dans la classe anonyme, ces anonymes de la classe sont compilés avec le format de nom (
<<Enclosing Class name>>$<<1(Number)>>
), supposons donc que supposer si non final variables locales sont autorisées alors compilateur ne peut pas retrouver d'où cette variable locale est appelée classe anonyme' '.catégorie " fichiers sont créés/compilé avec susmentionnés format séparément comme d'habitude les classes java.Donc si la variable locale est définitive, le compilateur crée une instance finale dans le anoymous classe qui permet de ne pas créer d'ambiguïté pour le compilateur.
Consultez le lien mentionné ci-dessus pour plus d'informations
OriginalL'auteur C T Mithun