Variable locale du journal définie dans un cadre englobant doit être définitive ou efficacement final
Je suis nouveau sur lambda et Java8. Je suis en face d'erreur suivant.
Variable locale du journal définie dans un cadre englobant doit être définitive ou
effectivement final
public JavaRDD<String> modify(JavaRDD<String> filteredRdd) {
filteredRdd.map(log -> {
placeHolder.forEach(text -> {
//error comes here
log = log.replace(text, ",");
});
return log;
});
return null;
}
OriginalL'auteur Balaji Reddy | 2016-07-15
Vous devez vous connecter pour publier un commentaire.
Le message dit exactement quel est le problème: votre variable journal doit être définitive (c'est-à: effectuer le mot-clé final) ou être efficacement final (qui est: il vous suffit de lui affecter une valeur une fois à l'extérieur de la lambda).
Sinon, vous ne pouvez pas utiliser cette variable dans votre lambda déclaration.
Mais bien sûr, qui est en conflit avec votre utilisation du journal. Le point est: vous ne pouvez pas écrire quelque chose d'extérieur à partir de l'intérieur de la lambda ... donc il faut prendre du recul et de chercher d'autres moyens pour ce que vous avez l'intention de le faire.
Dans ce sens: il suffit de croire le compilateur.
Delà, il y a un de base point à comprendre: vous pouvez pas utiliser une variable locale que vous pouvez écrire. Les variables locales sont "copiés" dans le contexte de la lambda au moment de l'exécution, et afin d'atteindre déterministe du comportement, ils ne peuvent être lus, et devrait être constantes.
Si votre cas est de écrire à un objet, alors il devrait être le terrain de votre classe englobante par exemple!
Donc, longue histoire courte:
OriginalL'auteur GhostCat
La raison de cette limitation est la même que la raison pour le langage Java fonctionnalité qui variables locales accessibles de l'intérieur (anonyme) intérieur classes doivent être (efficacement) finale.
Cette réponse par rgettman se retrouve dans les détails. rgettman explique les limitations dans le détail précis et je créer un lien vers cette réponse, parce que le comportement des expressions lambda doit être la même que celle de l'anonyme intérieur des classes. Notez qu'une telle limitation n'existe pas pour la classe ou les variables d'instance, cependant. La principale raison pour cela est un peu compliqué et je ne pouvais pas l'expliquer mieux que ce que Roedy Vert est-il ici. La copie ici que c'est donc à un seul endroit:
OriginalL'auteur Kedar Mhaswade
Souvenez-vous de la méthode de classes internes ne pouvez pas modifier n'importe quelle valeur de leurs environs, de la méthode. Votre deuxième expression lambda dans forecach est en train d'essayer d'accéder à son environnement de la méthode de la variable (log).
Pour résoudre ce problème, vous pouvez éviter d'utiliser lambda pour chacun et donc simple pour les uns et re-palais de toutes les valeurs dans le journal.
OriginalL'auteur Mr.Q