【问题标题】:Static factories IntStream Exception while Foreach loop [duplicate]Foreach循环时静态工厂IntStream异常[重复]
【发布时间】:2018-02-09 13:02:40
【问题描述】:

谁能帮我解释一下为什么这个案子会例外?

IntStream i = IntStream.of(6,5,7,1, 2, 3, 3);
    IntStream d = i.map(n -> n+1 );
    d.forEach(System.out::print);
    System.out.println();
    System.out.println("Origional Streams" );
    i.forEach(System.out::print);

这是输出。

7682344
Origional Streams
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
at java.util.stream.IntPipeline$Head.forEach(IntPipeline.java:557)

【问题讨论】:

  • 我打赌这将被关闭为重复...d.forEach 然后i.forEach 调用两个终端操作...
  • 我也 d.close();也给出了同样的错误。两个 IntStream 上都有终端操作,我认为它们是线程安全的。
  • 是的,有两个终端操作.. 你打电话给forEach 两次。线程安全与此有什么关系?
  • @Eugene 你能建议我解决这个问题吗?你不认为有两个流。 ?每个都独立运行??
  • 您为此创建一个供应商...Supplier<IntStream> sup = () -> IntStream.of(6, 5, 7, 1, 2, 3, 3); 并随时致电sup.get() 以获取新的IntStream

标签: collections java-8 java-stream


【解决方案1】:

看那个

d = i.map(n -> n + 1);

表示流 d 正在获取流 i 的引用, 现在 forEach 是一个终端操作,消耗 i 的流,也会影响 d 上的 ref。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多