Поток IllegalStateException - PullRequest
       13

Поток IllegalStateException

1 голос
/ 15 апреля 2019

Я сталкиваюсь с этой ошибкой и не знаю, как ее отладить. Суть вопроса в том, что я должен получить минимум и максимум потока. Я не могу использовать Коллекции, и поток должен быть распараллеливаемым. Кроме того, поток является аргументом, поэтому его нельзя дублировать. Я не прошу решения, но только то, что означает ошибка.

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)

Ответы [ 2 ]

3 голосов
/ 15 апреля 2019

Использование intstream.count() закрывает поток (потому что он должен обработать весь поток для подсчета количества элементов).Однако ваша проверка совершенно не нужна, поскольку она уже возвращает необязательный параметр, который будет пустым, если поток имеет значение.

1 голос
/ 15 апреля 2019

В Java 8 каждый поток представляет собой одноразовую последовательность данных, которая поддерживает несколько операций ввода-вывода в конвейере.

После завершения переданных по конвейеру операций экземпляр потока используется и закрывается.

Если вы попытаетесь использовать тот же поток еще раз в другой части вашего кода, вы получите java.lang.IllegalStateException: stream has already been operated upon or closed

В своем коде вы используете его дважды: - instream.count() и instream.map()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...