Comment travailler avec des flux Java 8?


Je veux savoir comment travailler avec Java 8 ruisseaux et comment utiliser les différents types de disposition flux des opérations. Par exemple, j'ai écrit cette partie du code:

ArrayList<State> toBeRemoved = new ArrayList<>();
for (State s : newStates)
     if (path.contains(s))     // path is a stack of State
         toBeRemoved.add(s);
for (State s : toBeRemoved)
     newStates.remove(s);

Je veux le réécrire en utilisant java 8 stream api calls. Comment puis-je le faire?

Author: Eran, 2015-06-06

2 answers

Pas besoin d'un flux ici, vous pouvez utiliser nouveaux Collection#removeIf méthode:

newStates.removeIf(path::contains);

Ou, si path est un Collection:

newStates.removeAll(path);
 5
Author: assylias, 2015-06-08 14:00:55

Dans ce cas, vous pouvez simplement produire une liste de sortie contenant uniquement les États qui doivent être conservés, et affecter cette liste à la variable newStates:

newStates = newStates.stream()
                     .filter(s -> !path.contains(s))
                     .collect(Collectors.toList());

Le filtre ne conserve que les États pour lesquels path.contains(s) renvoie false.

Bien sûr, si newStates est initialisé à l'origine en tant que copie d'une liste "oldStates", vous pouvez ignorer cette étape d'initialisation et utiliser la liste "oldStates" d'origine comme entrée.

 3
Author: Eran, 2015-06-06 12:43:29