Поток не может изменять базовую коллекцию (если сама коллекция не отображается), поэтому элементы нельзя добавлять или удалять, а также нельзя изменять порядок. Когда вы потребляете поток в терминальной операции, создается новая коллекция (но вы можете собирать ее в другую существующую коллекцию). неизменны. Это плохая практика, но это можно сделать.
Пример:
class Item { public int x; public Item(int x) { this.x = x; } }
var list = List.of(new Item(1), new Item(2));
list.stream().peek(item -> item.x = 3).collect(toList());
Когда поток потребляется с помощью collect
(или count
, forEach
или любого другого терминала операция), обратный вызов peek
изменит каждый элемент. После выполнения вышеуказанного кода ваш список будет содержать 2 элемента со значением x=3
. peek
- произвольно выбранная нетерминальная операция. Такое же поведение можно наблюдать с filter
, map
/ flatMap
или любой другой нетерминальной операцией.
По сути это очень похоже на: Is Java "pass -по ссылке »или« передаче по значению »? , только лучше скрыть.