当前位置: 首页 > 知识库问答 >
问题:

流供应商获取错误“流已被操作或关闭”

松俊美
2023-03-14

即使我在我的流中使用Supplier并在每次我想检索我的strem并对其执行终端操作时使用Supplier.get(),我仍然得到“Stream已经被操作或关闭”异常。有人能看看我的代码并建议我做错了什么吗?

引发异常的方法

private static void printMyDetails(Supplier<Stream<Result>> mySupplier, String myStatus) {
        checkNotNull(mySupplier);
        checkArgument(isNotEmpty(myStatus), "Invalid My status");

        if (mySupplier.get().noneMatch(result -> true)) { //<-This is where the exception is thrown
            if (log.isInfoEnabled()) {
                log.info("Number of My with status '{}': {}", My, 0);
            }
        } else {
            log.info("Number of My with status '{}': {}", myStatus, mySupplier.get().count());
            log.info("Details of My(s) with status: '{}'", myStatus);
            mySupplier.get().sorted().forEach(Utils::printMyNameAndDetails);
        }
    }
rb.keySet().stream().filter(key -> containsIgnoreCase(key, "status")).map(rb::getString)
                .filter(StringUtils::isNotEmpty).forEach(status -> {
            var resultsWithExpectedStatusSupplier = requireNonNull(getResultsWithExpectedStatusSupplier(results, status));
            resultsWithExpectedStatusSupplier.ifPresentOrElse(streamSupplier -> printMyDetails(streamSupplier, status), () -> {
                if (log.isInfoEnabled())
                    log.info("0 My with status: {}", status);
            });
        });

流供应商:

private static Optional<Supplier<Stream<Result>>> getResultsWithExpectedStatusSupplier(
            @NotNull List<Result> results, @NotNull String expectedStatus) {
        checkArgument(!results.isEmpty(), "Results list is empty");
        checkArgument(isNotEmpty(expectedStatus), "Invalid expected status");

        var resultStreamWithExpectedStatus = requireNonNull(results.stream().filter(result -> ofNullable(result).map(Result::getStatus)
                .allMatch(s -> isNotEmpty(s) && s.equalsIgnoreCase(expectedStatus))));
        return resultStreamWithExpectedStatus.count() == 0 ? Optional.empty() : Optional.of(() -> resultStreamWithExpectedStatus);
    }

共有1个答案

班经亘
2023-03-14

您可以只使用一次流。看起来供应商总是一次又一次地给出相同的流。在第一终端操作之后,流被排出;来自供应商的流必须一直是一个新的流。

 类似资料:
  • 方法是 现在我试着像这样改成stream,但我不知道这种改是否正确: 如何避免出现例外,解决问题? 我应该以某种方式重构代码吗?

  • java-stream已被操作或关闭 与合作可以解决此问题。 所以我当前的代码如下: 相同的错误信息。

  • 我想复制一个Java8流,这样我可以处理它两次。我可以

  • 我想复制一个Java 8流,这样我可以处理它两次。我可以作为列表并从中获取新流; 但我觉得应该有一个更高效/更优雅的方法。 有没有一种方法可以复制流而不将其变成集合? 我实际上正在处理一个流,所以在移动到右侧投影并以另一种方式处理之前,希望先以一种方式处理左侧投影。类似于这样(到目前为止,我不得不使用技巧)。

  • 问题内容: 我想复制一个Java 8流,以便可以处理两次。我可以collect列出并从中获得新的信息流; 但我认为应该有一种更有效/更优雅的方法。 有没有一种方法可以复制流而不将其转换为集合? 我实际上正在使用 流,因此想先处理左侧投影,然后再移至右侧投影并以另一种方式处理。有点像这样(到目前为止,我被迫使用这种技巧)。 问题答案: 你可以将局部变量与一起使用,以设置流管道的公共部分。 从http