Java 流已被操作或关闭-供应商没有帮助

Java 流已被操作或关闭-供应商没有帮助,java,java-stream,Java,Java Stream,我不熟悉Java8流编码。 这是我正在尝试运行的一段代码 Supplier filteredSupplier = () -> Stream.of(filteredStream.toArray(Obj[]::new)); Stream.concat((Stream<Obj>)filteredSupplier.get(), Stream.of(objs)).forEach(some operation); supplierfilteredsupplier=()->Stream.o

我不熟悉Java8流编码。 这是我正在尝试运行的一段代码

Supplier filteredSupplier = () -> Stream.of(filteredStream.toArray(Obj[]::new));
Stream.concat((Stream<Obj>)filteredSupplier.get(), Stream.of(objs)).forEach(some operation);
supplierfilteredsupplier=()->Stream.of(filteredStream.toArray(Obj[]::new));
Stream.concat((Stream)filteredSupplier.get(),Stream.of(objs)).forEach(某些操作);
据我所知,如果您使用供应商,您可以随时使用流,方法是在供应商上使用get()函数。但我仍然得到“流已经被操作或关闭”

请帮助我理解,在这一行中,使用来自供应商的流是否也有任何限制

Supplier filteredSupplier = () -> Stream.of(filteredStream.toArray(Obj[]::new));
有两个流:
filteredStream
和由(…)的流返回的一个流

供应商的
get
方法的每次调用都将导致对(…)
流的调用,从而创建一个新流。但是,每个调用将使用相同的
filteredStream
。您的
供应商
在您第二次调用它时将无法工作,因为
过滤数据流
在第一次调用期间已“用完”

为避免出现异常,请尝试将上面的行替换为以下内容:

    Obj[] array = filteredStream.toArray(Obj[]::new);
    Supplier<Stream<Obj>> filteredSupplier = () -> Stream.of(array);
Obj[]数组=filteredStream.toArray(Obj[]::新建);
供应商过滤器供应商=()->流(数组);
这只使用
filteredStream
一次,无论您调用
供应商的
get
方法多少次。

在这一行中

Supplier filteredSupplier = () -> Stream.of(filteredStream.toArray(Obj[]::new));
有两个流:
filteredStream
和由(…)
的流返回的一个流

供应商的
get
方法的每次调用都将导致对(…)
流的调用,从而创建一个新流。但是,每个调用将使用相同的
filteredStream
。您的
供应商
在您第二次调用它时将无法工作,因为
过滤数据流
在第一次调用期间已“用完”

为避免出现异常,请尝试将上面的行替换为以下内容:

    Obj[] array = filteredStream.toArray(Obj[]::new);
    Supplier<Stream<Obj>> filteredSupplier = () -> Stream.of(array);
Obj[]数组=filteredStream.toArray(Obj[]::新建);
供应商过滤器供应商=()->流(数组);

这只使用
filteredStream
一次,无论您调用
供应商的
获取方法多少次。

谢谢您的说明。我有一个用例,其中我有一个流,我必须多次使用它(filteredStream)。。因此,我首先将其转换为一个数组以获取其供应商,然后使用供应商一次又一次地获取流。我没有流的源列表或集合。。在这种情况下我该如何工作???有人输入吗?@Ka123:在这种情况下,您希望从
filteredStream
创建一次数组,然后从该数组创建任意次数的流。要做到这一点,需要从供应商那里创建阵列。看我更新的答案。事实上,供应商完全过时了,因为它对程序逻辑没有任何贡献。当您将每次出现的
filteredSupplier.get()
替换为
Stream.of(array)
时,您可以删除整个声明
Supplier filteredSupplier=()->Stream.of(array)和程序仍然像以前一样工作。这同样适用于问题的代码,这就是为什么供应商没有提供帮助的原因,它没有改变逻辑。这一切都是关于调用
filteredStream.toArray
的时间和频率。供应商只是混淆了这一点。谢谢您的描述。我有一个用例,其中我有一个流,我必须多次使用它(filteredStream)。。因此,我首先将其转换为一个数组以获取其供应商,然后使用供应商一次又一次地获取流。我没有流的源列表或集合。。在这种情况下我该如何工作???有人输入吗?@Ka123:在这种情况下,您希望从
filteredStream
创建一次数组,然后从该数组创建任意次数的流。要做到这一点,需要从供应商那里创建阵列。看我更新的答案。事实上,供应商完全过时了,因为它对程序逻辑没有任何贡献。当您将每次出现的
filteredSupplier.get()
替换为
Stream.of(array)
时,您可以删除整个声明
Supplier filteredSupplier=()->Stream.of(array)和程序仍然像以前一样工作。这同样适用于问题的代码,这就是为什么供应商没有提供帮助的原因,它没有改变逻辑。这一切都是关于调用
filteredStream.toArray
的时间和频率。供应商只是混淆了这一点。