流供应商收到错误消息“流已被操作或关闭”

即使我每次将供应商用于流并且每次要检索我的strem并对其执行终端操作时都使用Supplier.Get(),我仍然会收到“流已被操作或关闭”的信息。例外。有人可以看一下我的代码并建议我做错了什么吗?

引发异常的方法:

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);
    }
woliufeiyu 回答:流供应商收到错误消息“流已被操作或关闭”

您只能消费一次Stream。供应商似乎总是一次又一次地提供相同的流。在第一个终端操作之后,流被排干;供应商的信息流必须一直是新的信息流。

,

一般的问题就像克里斯蒂安·乌伦邦姆(Christian Ullenboom)所说:流已经被消耗掉了。代码中的确切位置是方法resultStreamWithExpectedStatus.count()中对getResultsWithExpectedStatusSupplier的调用,因为Stream.count是归约/终止操作,它消耗流。

this answer,如果不消耗流,就无法获得流的大小。通过将过滤后的项目存储在集合中(例如Collectors.toList),查询那里的大小并返回集合本身(而不是流)来解决此问题?

在旁注中,我认为您滥用Optional的情况太多了。该代码可以更简单地传递空流(甚至更好:传递一个空的,经过过滤的集合)。

本文链接:https://www.f2er.com/3160221.html

大家都在问