Negli stream Java8, sono autorizzato a modificare/aggiornare gli oggetti all'interno? Ad es. List<User> users
:Modifica degli oggetti nello stream in Java8 durante l'iterazione
users.stream().forEach(u -> u.setProperty("value"))
Negli stream Java8, sono autorizzato a modificare/aggiornare gli oggetti all'interno? Ad es. List<User> users
:Modifica degli oggetti nello stream in Java8 durante l'iterazione
users.stream().forEach(u -> u.setProperty("value"))
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
.
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));
per liberarsi da ConcurrentModificationException Usa CopyOnWriteArrayList
Questo è effettivamente corretto, ma: questo dipende dalla classe specifica che viene utilizzata qui. Ma quando si sa che si ha una 'Lista
Quali sono le soluzioni, se si desidera modificare gli utenti? – Augustas
@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
@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