Java 8 Stream是安全的返回类型吗?

arc*_*rty 11 java java-8 java-stream

Java 8 Streams是否是公共方法的安全返回类型,因为在给定流的基础对象时不可能改变它?

例如,如果我有一个List并且return list.stream();可以以任何方式使用返回值来改变原始列表吗?

从API来看,我认为这不可能,但我想确认一下.

Rad*_*def 13

是的,这样做是安全的.流不会/不应该修改基础数据结构.

以下摘录java.util.stream.Stream:

序列元素[...].

收藏和流虽然有一些肤浅的相似之处,但却有不同的目标.馆藏主要关注其元素的有效管理和访问.相比之下,流不提供直接访问或操纵其元素的手段 [...].

为了保持正确的行为,[流操作的行为参数...]必须是非干扰的(它们不会修改流源).

包装java.util.stream描述:

Streams在几个方面与集合不同:

  • 没有存储空间 流不是存储元素的数据结构 ; 相反,它通过计算操作管道传递来自源[...]的元素.
  • 功能性.对流的操作会产生结果,但不会修改其来源.

您可能还会看到无干扰.


[...]如果给出来自它的流,则不可能改变底层对象.

虽然可以编写我们自己java.util.Stream修改底层数据结构的实现,但这样做是错误的.; )


回应@AlexisC的评论:

从列表中获取流可以修改其内容(如果它包含可变对象).

这是一个公平的观点.如果我们有一个可变元素流,我们可以这样做:

myObj.stream().forEach(( Foo foo ) -> ( foo.bar = baz ));
Run Code Online (Sandbox Code Playgroud)

  • @kajacx有可能通过反射获得对底层数据结构的引用,但对于Java中的任何不变性都可以这样说.如果你想写一些hacky代码,没有什么是不可变的.同样适用于例如`Collections.unmodifiableList`. (4认同)