2015-06-11 7 views

Antwort

46

Ja, können Sie Zustand der Objekte in Ihrem Stream ändern, aber Sie sollten nicht Zustand der Quelle des Stroms ändern.

Das ist also OK

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

aber

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

ist nicht und ConcurrentModificationException werfen kann.

+0

Was Lösungen sind, wenn Sie Benutzer ändern möchten? – Augustas

+1

@Augustas Es hängt alles davon ab, wie Sie diese Liste ändern möchten. Aber im Allgemeinen sollten Sie 'Iterator' vermeiden, das das Ändern der Liste verhindert (Entfernen/Hinzufügen neuer Elemente) während der Iteration und beider Streams und für jede Schleife, die sie verwenden. Sie könnten versuchen, eine einfache Schleife wie 'for (int i = 0; ..; ..)' zu verwenden, die dieses Problem nicht hat (aber Sie nicht stoppen wird, wenn ein anderer Thread Ihre Liste ändert). Sie können auch Methoden wie 'list.removeAll (Collection)', 'list.removeIf (Prädikat)' verwenden. Auch die 'java.util.Collections' Klasse hat einige Methoden, die nützlich sein könnten wie' addAll (CollectionOfNewElements, list) '. – Pshemo

+0

@Pshemo, eine Lösung besteht darin, eine neue Instanz einer Collection wie ArrayList mit den Elementen innerhalb Ihrer Primärliste zu erstellen; Iteriere über die neue Liste und führe die Operation in der primären Liste aus: new ArrayList <> (Benutzer) .stream.forEach (u -> users.remove (u)); – MNZ

2

Um strukturelle Änderungen an der Quelle des Streams durchzuführen, wie Pshemo in seiner Antwort erwähnt, ist eine Lösung, eine neue Instanz eines Collection wie ArrayList mit den Elementen innerhalb Ihrer primären Liste zu erstellen; Iteriere über die neue Liste und führe die Operationen auf der primären Liste aus.

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

Um ConcurrentModificationException Verwenden CopyOnWriteArrayList von loszuwerden

+1

Das ist eigentlich richtig, aber: das hängt von der spezifischen Klasse ab, die hier verwendet wird. Aber wenn Sie nur wissen, dass Sie eine 'List ' haben - Sie haben keine Ahnung, ob das eine CopyOnWriteArrayList ist. Also eher ein mittelmäßiger Kommentar, aber keine richtige Antwort. – GhostCat

Verwandte Themen