无法从 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 创建。
我有一个方法 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 创建。