Java 8 Stream 是安全的返回类型吗?
2022-09-04 20:53:06
Java 8 Streams是否为公共方法提供了安全的返回类型,因为在给定来自它的流的流的情况下,不可能改变底层对象?
例如,如果我有一个,并且返回值是否可以以任何方式用于改变原始列表?List
return list.stream();
从API来看,我认为这是不可能的,但想确认一下。
Java 8 Streams是否为公共方法提供了安全的返回类型,因为在给定来自它的流的流的情况下,不可能改变底层对象?
例如,如果我有一个,并且返回值是否可以以任何方式用于改变原始列表?List
return list.stream();
从API来看,我认为这是不可能的,但想确认一下。
是的,这样做是安全的。流不会/不应修改底层数据结构。
来自java.util.stream.Stream的
一些摘录:
一系列元素 [...]。
集合和流虽然具有一些表面上的相似之处,但具有不同的目标。馆藏主要关注对其元素的有效管理和访问。相比之下,流不提供直接访问或操作其元素的方法[...]。
为了保持正确的行为,[流操作的行为参数...]必须是非干扰的(它们不会修改流源)。
从 Package java.util.stream
描述:
流在几个方面与集合不同:
- 无存储。流不是存储元素的数据结构;相反,它通过计算操作的管道从源[...]传达元素。
- 功能性。对流的操作会生成结果,但不会修改其源。
您可能还会看到“非干扰”。
[...]给定来自它的流,不可能改变底层对象。
虽然可以编写我们自己的修改了底层数据结构的实现,但这样做将是一个错误。;)java.util.Stream
针对@AlexisC的评论:
从列表中获取流[...] 如果包含可变对象,则可以修改其内容。
这是一个公平的观点。如果我们有一个可变的元素流,我们可以做到:
myObj.stream().forEach(( Foo foo ) -> ( foo.bar = baz ));