无法从 List<Mono<BOLCompliance>> 转换为 List<BOLCompliance>

Cannot convert from List<Mono<BOLCompliance>> to List<BOLCompliance>

我有一个方法 createComplianceResponse(),它是 returning BOLCompliance 对象,在此之前我更改为 BOLCompliance 的 Mono,因为我必须在其中调用另一个反应式服务。 但是在这样做之后,我从中调用该服务的当前服务在第 6 行和第 7 行出现错误。

1) Cannot convert from Mono<Object> to Mono<List<BOLCompliance>>
2) Cannot convert from List<Mono<BOLCompliance>> to List<BOLCompliance>
    private Mono<List<BOLCompliance>> getComplienceRouteLink(BOLRouteLink routeLink, BillOfLadingResponse bol) {
        if (null != routeLink.getComplianceIds() && !routeLink.getComplianceIds().isEmpty()) {
            Mono<List<Compliance>> complianceList = Flux
                    .fromIterable(routeLink.getComplianceIds()).flatMap(cmp ->
                            complianceCaller.getComplianceById(cmp)).collectList();
            return complianceList.flatMap(compliancesOld -> {
                List<BOLCompliance> complianceResponses = compliancesOld.parallelStream()
                        .map(compliance -> createComplianceResponse(compliance,bol)
                        ).collect(Collectors.toList());
                return Mono.just(complianceResponses);
            });
        }

我为之更改 return 类型的其他服务是

private Mono<BOLCompliance> createComplianceResponse(Compliance compliance, BillOfLadingResponse bol);

请看一下这个,它可以替换您的代码:

private Flux<BOLCompliance> getComplienceRouteLink(BOLRouteLink routeLink, BillOfLadingResponse bol) {
    return Mono.justOrEmpty(routeLink.getComplianceIds())
        .flatMapMany(Flux::fromIterable)
        .flatMap(id -> complianceCaller.getComplianceById(id))
        .flatMap(compliance -> createComplianceResponse(compliance, bol));
}

而不是 returning a Mono<List<Something>> 你 return a Flux<Something> 并且可以并行化它。同样重要的是要知道,什么调用可能需要更长的时间,并且需要在另一个线程池上进行调度以进行并行化。您可以轻松地通过在另一个线程池上进行调度来扩展此 Flux 创建。