在Java 8中重用Streams

时间:2016-08-14 01:39:23

标签: java java-stream

我需要计算大列表的两个部分的比例,其中第一部分包含第二部分:

Stream<Element> part1 = list.stream().filter(x -> x.getN1() < x.getN2);
int result = part1.filter(y -> y.isRight()).count() / part1.count();

但是此代码抛出异常: java.lang.IllegalStateException:stream已经被操作或关闭

我可以编写代码而无需在结果中创建相同的 part1 流吗?

2 个答案:

答案 0 :(得分:1)

您只能重复使用集合,因为它会记录结果。

List<Element> part1 = list.stream().filter(x -> x.getN1() < x.getN2).collect(toList());
double result = (double) part1.stream().filter(y -> y.isRight()).count() / part1.size();

Stream是某些代码的构建器,在运行时进行了优化。它的执行并不像它看起来那么动态。

答案 1 :(得分:0)

Streams不应该被重用,或者如果你想要一些东西,你可以使用这里提到的供应商:Copy a stream to avoid "stream has already been operated upon or closed" (java 8)