Jos*_*erg 3 java immutability java-stream
如果我的 API 提供流,客户端是否可以修改底层集合?
例如:
class ListWrapper {
List<String> myList;
...
Stream<String> getStream() {
return myList.stream();
}
}
Run Code Online (Sandbox Code Playgroud)
客户端是否可以调用listWrapper.getStream()并以某种方式修改myList?
流不能修改底层集合(如果集合本身没有公开),因此不能添加或删除元素,也不能更改顺序。当您在终端操作中使用流时,会构建一个新集合(但您可以收集到另一个现有集合中)。
但是,如果元素本身是可变的,流操作仍然可以修改单个元素。这是不好的做法,但可以做到。
例子:
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());
Run Code Online (Sandbox Code Playgroud)
当流被collect(或count或forEach或任何其他终端操作)消耗时,peek回调将修改每个元素。运行上述代码后,您的列表将包含 2 个值为 的项目x=3。peek是任意选择的非终端操作。使用filter、map/flatMap或任何其他非终端操作可以观察到相同的行为。
从本质上讲,这非常类似于:Java 是“按引用传递”还是“按值传递”?,但至少隐藏得更好。
| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |