2015-06-11 15 views

risposta

46

Sì, è possibile modificare lo stato degli oggetti all'interno del flusso, ma non è necessario modificare lo stato di fonte di flusso.

Quindi questo è OK

List<User> users = getUsers(); 
users.stream().forEach(u -> u.setProperty(value)); 

ma

users.stream().forEach(u -> users.remove(u)); 

non è e può gettare ConcurrentModificationException.

+0

Quali sono le soluzioni, se si desidera modificare gli utenti? – Augustas

+1

@Augustas Tutto dipende da come si desidera modificare questo elenco. Ma in generale dovresti evitare "Iterator" che impedisce di modificare la lista (rimuovendo/aggiungendo nuovi elementi) mentre iterazione e entrambi i flussi e per-loop lo stanno usando. Potresti provare ad usare un semplice ciclo come 'for (int i = 0; ..; ..)' che non ha questo problema (ma non ti fermerà quando altri thread modificheranno la tua lista). Puoi anche usare metodi come 'list.removeAll (Collection)', 'list.removeIf (Predicate)'. Anche la classe 'java.util.Collections' ha pochi metodi che potrebbero essere utili come' addAll (CollectionOfNewElements, list) '. – Pshemo

+0

@Pshemo, una soluzione è quella di creare una nuova istanza di una raccolta come ArrayList con gli elementi all'interno dell'elenco principale; scorrere il nuovo elenco e fare l'operazione sull'elenco principale: new ArrayList <> (users) .stream.forEach (u -> users.remove (u)); – MNZ

2

Per apportare modifiche strutturali all'origine del flusso, come Pshemo ha menzionato nella sua risposta, una soluzione è creare una nuova istanza di Collection come ArrayList con gli elementi all'interno dell'elenco principale; scorrere il nuovo elenco e eseguire le operazioni nell'elenco principale.

new ArrayList<>(users).stream().forEach(u -> users.remove(u)); 
0

per liberarsi da ConcurrentModificationException Usa CopyOnWriteArrayList

+1

Questo è effettivamente corretto, ma: questo dipende dalla classe specifica che viene utilizzata qui. Ma quando si sa che si ha una 'Lista ' - non si ha idea se si tratta di una CopyOnWriteArrayList. Quindi questo è più un commento mediocre, ma non una vera risposta. – GhostCat

Problemi correlati