如何使用 Mono<Boolean> 作为调用第二种方法的条件

How can I use Mono<Boolean> as condition to call second method

我在检查另一项服务的条件后尝试调用一项服务

以迭代的方式,我可以做到这一点

if (productService.isProductNotExcluded(product)){
    List<Properties> properties = propertiesService.getProductDetailProperties(product)
...
}

但由于 isProductExcluded 正在返回 Mono<Boolean> 我正在采用这种看起来很奇怪的方法。

Flux<Properties> properties = productService.isProductNotExcluded(productId)
     .filter(notExcluded -> notExcluded)
     .map(ok-> propertiesService.getProductDetailProperties(product))
     ...

解决这种情况的正确方法是什么?

你所做的并不奇怪,我个人不会 return 反应函数中的布尔值 Mono<Boolean> 如果我可以避免它,但这并没有错,有时你没有一个选择。

为了清楚起见,我个人会在地图中加入 if else 语句。我会更改函数的名称,并重写 isNot 部分。

Flux<Properties> properties = productService.isExcluded(productId)
   .flatMap(isExcluded -> {
       if(!isExcluded)
         return propertiesService.getProductDetailProperties(product);
       else
         return mono.empty();
   });

这是个人观点和编码品味的问题,但我发现这更具可读性,因为您可以阅读代码并立即理解它。但这是个人品味。

对于 returns 和 Mono<Boolean> 的谓词,您还可以使用 filterWhen 将发布者作为谓词。像这样:

Flux<Properties> properties = Mono.just(productId)
.filterWhen(prodId -> productService.isProductNotExcluded(prodId))
.map(validProductId -> propertiesService.getProductDetailProperties(validProductId));   

可以使用all()运算符。

根据文档。 all() 发出一个 boolean true if all values of this sequence match

Mono all(Predicate<? super T> predicate) {}