我正面临这个错误,不知道如何调试它。问题的摘要是我必须获得流的最小值和最大值。我不能使用集合,并且流必须是可并行化的。此外,流是一个参数,因此它不能重复。我不是要求解决方案,而是错误意味着什么。
class MinMax {
final int min, max;
static Optional<MinMax> findMinMax(Stream<Integer> instream) {
if(instream.count() > 0) {
Optional<MinMax> ans = instream.map(x -> {return new MinMax(x,x);}).reduce((x, y) -> {
Integer max = x.max;
Integer min = x.min;
if (y.min < min){
min = y.min;
}
if (y.max > max) {
max = y.max;
}
return new MinMax(min, max);
});
return ans;
} else {
return Optional.empty();
}
}
public MinMax(int min, int max) {
this.min = min;
this.max = max;
}
@Override
public String toString() {
return min + ", " + max;
}
}
线程“main”中的异常java.lang.IllegalStateException:stream已在java.base / java.util.stream上的java.base / java.util.stream.AbstractPipeline。(AbstractPipeline.java:203)上操作或关闭。 .ReferencePipeline。(ReferencePipeline.java:94)java.base / java.util.stream.ReferencePipeline $ StatelessOp。(ReferencePipeline.java:696)at java.base / java.util.stream.ReferencePipeline $ 3.(ReferencePipeline.java) :189)位于Main.main的MinMax.findMinMax(MinMax.java:11)的java.base / java.util.stream.ReferencePipeline.map(ReferencePipeline.java:188)(MinMax.java:46)
使用intstream.count()
关闭流(因为它需要处理整个流以计算元素的数量)。但是,您的检查是完全不必要的,因为它已经返回一个可选项,如果该流是空的,它将为空。
在Java 8中,每个Stream都是一次性使用的数据序列,支持管道中的多个I / O操作。
在管道操作结束后,流实例将被消耗并关闭。
如果您尝试在代码的另一部分再次使用相同的流,您将获得java.lang.IllegalStateException: stream has already been operated upon or closed
在您的代码中,您使用它两次: - instream.count()
和instream.map()