In Java8-Streams darf ich Objekte innerhalb davon ändern/aktualisieren? Für z. List<User> users
:Ändern von Objekten innerhalb des Streams in Java8 während der Iteration
users.stream().forEach(u -> u.setProperty("value"))
In Java8-Streams darf ich Objekte innerhalb davon ändern/aktualisieren? Für z. List<User> users
:Ändern von Objekten innerhalb des Streams in Java8 während der Iteration
users.stream().forEach(u -> u.setProperty("value"))
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.
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));
Um ConcurrentModificationException Verwenden CopyOnWriteArrayList von loszuwerden
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
Was Lösungen sind, wenn Sie Benutzer ändern möchten? – Augustas
@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
@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