java - Java 8 流是不可变的吗?
问题描述
如果我的 API 提供流,客户端是否可以修改底层集合?
例如:
class ListWrapper {
List<String> myList;
...
Stream<String> getStream() {
return myList.stream();
}
}
客户是否可以调用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());
当流与collect
(或count
或forEach
或任何其他终端操作)一起使用时,peek
回调将修改每个元素。运行上述代码后,您的列表将包含 2 个值为x=3
. peek
是任意选择的非终端操作。filter
使用、map
/flatMap
或任何其他非终端操作可以观察到相同的行为。
从本质上讲,这非常类似于:Java 是“按引用传递”还是“按值传递”?,但隐藏得更好。
推荐阅读
- ruby - Ruby:bsearch 返回 nil
- python - 根据熊猫列中的条件计算平均值
- javascript - React Chart.js BarGraph 未更新
- python-3.x - tkinter 和鼠标位置
- arrays - Flutter:排序多维数组List
- c# - 在本地 IIS 上发布 ASP.Net Core 应用程序 - 找不到内容
- apache-flink - 升级 Apache Flink 需要更新 pom.xml 吗?
- xamarin - Xamarin.Forms 中突出显示的叠加层
- apache-spark - 如何在 Kubernetes 中通过 SSL 将 Apache Spark 连接到 Cassandra 集群
- javascript - React body 似乎没有达到 100% 的高度