Java8流是不可变的吗?

Java8流是不可变的吗?,java,java-stream,immutability,Java,Java Stream,Immutability,如果我的API提供了一个流,那么客户端是否有办法修改底层集合 例如: class ListWrapper { List<String> myList; ... Stream<String> getStream() { return myList.stream(); } } 类ListWrapper{ 列出我的清单; ... 流getStream(){ 返回myList.stream(); } } 客户端是否可以调用listWrapper.get

如果我的API提供了一个流,那么客户端是否有办法修改底层集合

例如:

class ListWrapper {
  List<String> myList;
  ...
  Stream<String> getStream() {
    return myList.stream();
  }
}
类ListWrapper{ 列出我的清单; ... 流getStream(){ 返回myList.stream(); } }
客户端是否可以调用
listWrapper.getStream()
并以某种方式修改
myList
的内容?

流无法修改基础集合(如果集合本身未公开),因此无法添加或删除元素,也无法更改顺序。当您在终端操作中使用流时,将生成一个新集合(但您可以收集到另一个现有集合中)

但是,如果元素本身是可变的,流操作仍然可以修改单个元素。这是不好的做法,但可以做到

例如:

class项{public int x;public项(int x){this.x=x;}
var列表=列表(新项目(1)、新项目(2));
list.stream().peek(item->item.x=3).collect(toList());
当使用
collect
(或
count
forEach
或任何其他终端操作)使用流时,
peek
回调将修改每个元素。运行上述代码后,您的列表将包含两个值为
x=3
的项目
peek
是一种任意选择的非终端操作。使用
过滤器
映射
/
平面映射
或任何其他非终端操作都可以观察到相同的行为


从精神上讲,这与:,非常相似,但至少隐藏得更好。

修改myList的结构或修改其中的单个元素。我想知道客户是否可以以任何方式更改myList(例如更改元素的顺序,或更改任何给定元素的内容)。请看,这个问题略有不同。我相信这个问题假设客户可以访问底层源代码集合(例如,
myList
)。这个问题是关于向客户机公开流的易变性风险。