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