【问题标题】:stream has already been operated upon or closed - supplier not helping流已被操作或关闭 - 供应商没有帮助
【发布时间】:2016-05-29 14:48:48
【问题描述】:

我是 Java 8 流编码的新手。 这是一段代码,我正在尝试运行。

Supplier filteredSupplier = () -> Stream.of(filteredStream.toArray(Obj[]::new));
Stream.concat((Stream<Obj>)filteredSupplier.get(), Stream.of(objs)).forEach(some operation);

据我所知,如果您使用供应商,您可以随时使用供应商上的 get() 函数来使用流。我仍然收到“流已被操作或关闭”。

请帮助我理解,使用来自供应商的流是否有任何限制??

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    在这一行

    Supplier filteredSupplier = () -> Stream.of(filteredStream.toArray(Obj[]::new));
    

    有两个流:filteredStreamStream.of(...) 返回的一个。

    Supplierget 方法的每次调用都会导致对Stream.of(...) 的调用,因此会创建一个新流。但是,每次调用都将使用相同的filteredStream。您的 Supplier 在您第二次调用时将无法正常工作,因为在第一次调用期间 filteredStream 流已“用完”。

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

        Obj[] array = filteredStream.toArray(Obj[]::new);
        Supplier<Stream<Obj>> filteredSupplier = () -> Stream.of(array);
    

    无论你调用多少次Supplierget 方法,这只会使用一次filteredStream

    【讨论】:

    • 感谢您的描述。我有一个用例,其中我有一个必须多次使用的流(filteredStream)。因此我首先将其转换为数组以获取供应商,然后使用供应商一次又一次地获取流.我没有 Stream 的源列表或集合。在这种情况下我该如何工作???
    • 任何输入任何人?
    • @Ka123:在这种情况下,您想从filteredStream 创建一个数组,然后从该数组创建任意次数的流。为此,请从供应商处创建数组。请参阅我的更新答案。
    • 实际上,供应商已经完全过时了,因为它对程序逻辑没有任何贡献。当您用Stream.of(array) 替换每个出现的filteredSupplier.get() 时,您可以删除整个声明Supplier&lt;Stream&lt;Obj&gt;&gt; filteredSupplier = () -&gt; Stream.of(array);,并且程序仍然像以前一样工作。这同样适用于问题的代码,这就是供应商没有提供帮助的原因,它没有改变逻辑。这一切都与调用filteredStream.toArray 的时间和频率有关。供应商只是混淆了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多