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

2022-09-04 20:53:06

Java 8 Streams是否为公共方法提供了安全的返回类型,因为在给定来自它的流的流的情况下,不可能改变底层对象?

例如,如果我有一个,并且返回值是否可以以任何方式用于改变原始列表?Listreturn list.stream();

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


答案 1

是的,这样做是安全的。流不会/不应修改底层数据结构。

来自java.util.stream.Stream的一些摘录:

一系列元素 [...]。

集合和流虽然具有一些表面上的相似之处,但具有不同的目标。馆藏主要关注对其元素的有效管理和访问。相比之下,流不提供直接访问或操作其元素的方法[...]。

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

Package java.util.stream 描述

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

  • 无存储。流不是存储元素的数据结构;相反,它通过计算操作的管道从源[...]传达元素。
  • 功能性。对流的操作会生成结果,但不会修改其源。

您可能还会看到“非干扰”。


[...]给定来自它的流,不可能改变底层对象。

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


针对@AlexisC的评论:

从列表中获取流[...] 如果包含可变对象,则可以修改其内容

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

myObj.stream().forEach(( Foo foo ) -> ( foo.bar = baz ));

答案 2

推荐