如何在Java流上调用多个终端操作

Meh*_*lik 6 java reusability java-8 java-stream

我知道,只要我们terminal method在上调用any stream,它就会关闭。

如果我们尝试在封闭的流上调用任何其他终端函数,则将导致java.lang.IllegalStateException: stream has already been operated upon or closed

但是,如果我们想多次重复使用同一流怎么办?

如何做到这一点?

Vij*_*ani 5

是的,在Java 8流中要重用流是不可以的

例如,对于任何终端操作,当操作关闭时,流将关闭。但是,当我们在链中使用Stream时,可以避免出现以下异常:

终端正常运行:

Stream<String> stream =
    Stream.of("d2", "a2", "b1", "b3", "c")
        .filter(s -> s.startsWith("a"));

stream.anyMatch(s -> true);    // ok
stream.noneMatch(s -> true);   // exception
Run Code Online (Sandbox Code Playgroud)

但与此相反,如果我们使用:

Supplier<Stream<String>> streamSupplier =
    () -> Stream.of("d2", "a2", "b1", "b3", "c")
            .filter(s -> s.startsWith("a"));

streamSupplier.get().anyMatch(s -> true);   // ok
streamSupplier.get().noneMatch(s -> true);  // ok
Run Code Online (Sandbox Code Playgroud)

在这里,.get()“构造”一个​​新的流,并在达到这一点时不再重用。

干杯!

  • 嗯,这是一种解决方法,但不是要求的内容:`如果我们要多次重复使用同一流,该怎么办? (3认同)
  • @VijayanKani在这种情况下,我实际上喜欢供应商..可能很有用,但是您需要更新明确说明的答案-不可能,但是您可以选择供应商... (3认同)
  • @Mehraj Malik:只需考虑流并不总是由Collection支持。例如,您可以从“随机”实例或网络渠道创建流,因此,当您尝试重用此类流时,会发生什么情况:a)每次获取不同的值,导致结果不一致,或者b)流应缓冲所有值,只是为了第二次使用? (2认同)