Come lavorare con Java 8 stream?


Voglio sapere come lavorare con Java 8 flussi e come utilizzare il diverso tipo di operazioni di flusso disponibili. Ad esempio, ho scritto questa parte del codice:

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);

Voglio riscriverlo usando java 8 stream api calls. Come posso farlo?

Author: Eran, 2015-06-06

2 answers

Non c'è bisogno di un flusso qui, è possibile utilizzare il nuovo Collection#removeIf metodo :

newStates.removeIf(path::contains);

Oppure, se path è un Collection:

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

In questo caso, puoi semplicemente produrre un elenco di output contenente solo gli Stati che dovrebbero essere mantenuti e assegnare tale elenco alla variabile newStates:

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

Il filtro mantiene solo gli Stati per i quali path.contains(s) restituisce false.

Naturalmente, se newStates è originariamente inizializzato come una copia di alcuni "oldStates" Lista, è possibile saltare quel passaggio di inizializzazione e utilizzare l'originale "oldStates" Lista come input.

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