【发布时间】:2019-04-15 08:52:59
【问题描述】:
我遇到了这个错误,不知道如何调试它。问题的总结是我必须得到一个流的最小值和最大值。我不能使用 Collections 并且流必须是可并行的。此外,流是一个参数,因此它不能被复制。我不是在寻求解决方案,而是错误的含义。
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 中的异常:流已被操作或关闭 在 java.base/java.util.stream.AbstractPipeline.(AbstractPipeline.java:203) 在 java.base/java.util.stream.ReferencePipeline.(ReferencePipeline.java:94) 在 java.base/java.util.stream.ReferencePipeline$StatelessOp.(ReferencePipeline.java:696) 在 java.base/java.util.stream.ReferencePipeline$3.(ReferencePipeline.java:189) 在 java.base/java.util.stream.ReferencePipeline.map(ReferencePipeline.java:188) 在 MinMax.findMinMax(MinMax.java:11) 在 Main.main(MinMax.java:46)
【问题讨论】:
-
您是否为同一个 Stream 多次调用
findMinMax? -
“流已经被操作”。您使用了两次相同的流。
-
附带说明,
.map(x -> {return new MinMax(x,x);})是不必要的冗长。您可以改用.map(x -> new MinMax(x,x))。除此之外,虽然基于 Reduction 的解决方案简单且正确,但基于collect的解决方案对于大流可能更有效,例如 this answer 末尾显示的SummaryStatistics实现。
标签: java java-stream illegalstateexception