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

时间:2015-04-14 21:29:14

标签: java java-8 java-stream

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

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

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

1 个答案:

答案 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 ));