Dans java8, comment définir la valeur mondiales dans les lambdas foreach bloc?
public void test(){
String x;
List<String> list=Arrays.asList("a","b","c","d");
list.forEach(n->{
if(n.equals("d"))
x="match the value";
});
}
1.Comme le code ci-dessus, je veux mettre la valeur d'une variable à côté de la foreach bloc, peut-il fonctionne?
2.Et pourquoi?
3.Et le foreach itérateur est dans l'ordre ou le désordre?
4.Je pense que le lamdas foreach bloc est simple et cool pour itérateur,mais c'est vraiment une chose compliquée à faire, plutôt que le même travail dans java 7 ou avant.
votre boucle peut être remplacé (par exemple) par
Argh - j'oublie toujours de cette méthode (anyMatch) et oui en effet, contient encore mieux. Merci!
suffit d'utiliser le bon vieux for-each.
Merci. En fait , je veux résoudre ce Problème. Link
if (list.stream().filter("d"::equals).findAny().isPresent()) x = "match the value";
. Dans la plupart des situations, il y aura un moyen d'écrire du code sans avoir à manipuler les variables externes.if(list.stream().anyMatch("d"::equals)) …
ou if(list.contains("d")) …
Argh - j'oublie toujours de cette méthode (anyMatch) et oui en effet, contient encore mieux. Merci!
suffit d'utiliser le bon vieux for-each.
Merci. En fait , je veux résoudre ce Problème. Link
OriginalL'auteur MarsYoung | 2015-09-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez, bien sûr, de "faire de l'extérieur de la valeur mutable" par l'intermédiaire d'un truc:
Préparez-vous pour un passage à tabac par la fonctionnelle puriste sur l'équipe, bien que. Beaucoup plus agréable, cependant, est d'utiliser une approche plus fonctionnelle (semblable à Sleiman l'approche de):
Costume vous-même.
OriginalL'auteur
En plus de la déjà fourni idiomatiques exemples, un autre hack serait d'utiliser AtomicReference, mais je ne le recommande si vous avez besoin d' 'forEach' et préférez quelque chose de plus lisible que vrai-la variante fonctionnelle:
AtomicReference
bien que je ne le recommande pas pour le foreach. Au lieu de cette approche est de sens que si elle est utilisée pour un parallelstream.OriginalL'auteur
effectively final
.vous pouvez obtenir la même chose de façon plus concise, à l'aide de
filter
etmap
.OriginalL'auteur
Comme il est déjà expliqué, vous ne pouvez pas modifier la variable locale de la méthode extérieure du corps de lambda (ainsi que de la classe anonyme corps). Mon conseil est de ne pas essayer d'utiliser les lambdas quand ils sont totalement inutiles. Votre problème peut être résolu comme ceci:
En général lambdas sont amis avec la programmation fonctionnelle où vous avez rarement mutable variables (chaque variable est attribuée qu'une seule fois). Si vous utilisez des lambdas, mais la poursuite de la réflexion en impératif de style, vous aurez toujours de tels problèmes.
x
est complètement inutile par la suite que pourrait ne pas être affecté.OriginalL'auteur