流IllegalStateException

时间:2019-04-15 08:53:00

标签: java java-stream illegalstateexception

我正在遇到此错误,并且不知道如何调试它。问题的摘要是,我必须获得流的最小值和最大值。我不能使用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;
    }
}
  

线程“主”中的异常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)

2 个答案:

答案 0 :(得分:3)

使用intstream.count()关闭流(因为它需要处理整个流才能计算元素的数量)。但是,您的检查完全没有必要,因为它已经返回了一个可选参数,如果流为空,则该参数为空。

答案 1 :(得分:1)

在Java 8中,每个Stream是一次性使用的数据序列,支持管道中的多个I / O操作。

管道操作结束后,流实例被消耗并关闭。

如果您尝试在代码的另一部分再使用同一流,则会得到java.lang.IllegalStateException: stream has already been operated upon or closed

您在代码中使用了两次: -instream.count()instream.map()