Discuss / Java / 聚合操作一定会使流关闭吗?

聚合操作一定会使流关闭吗?

Topic source
Stream<Integer> sum = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
sum.reduce(0, (acc, n) -> acc + n);
sum.forEach(System.out::println); //就是他导致了程序抛出异常
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
        at java.base/java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
        at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
        at com.learnjava.App.main(App.java:15)

如果我要对流进行后续的操作,比如这需要遍历输出,应该怎么做?

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

流的特点是每个元素只遍历一次,聚合操作无非就是一个遍历+累加计算的过程,内部已经自动帮你遍历了

你想再遍历一遍,那只能构造一个新的stream

如果需要输出每次累加的结果,应将输出写在 reduce 的方法体里

Stream<Integer> sum1 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
sum1.reduce(0, (acc, n) -> {
  System.out.println(acc = acc + n);
  return acc;
});

Mathematica 的 foldlist


  • 1

Reply