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

I'm trying to make a call to one service after checking a condition from another service in an iterative way, like so:

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

But since isProductExcluded is returning Mono<Boolean> I'm using this approach, which seems really odd:

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

Which is the correct way to deal with this kind of situation?

Upvotes: 5

Views: 16999

Answers (3)

Toerktumlare
Toerktumlare

Reputation: 14732

What you are doing is not odd. I personally wouldn't return a boolean in a reactive function Mono<Boolean> if I can avoid it, but it's not wrong and sometimes you don't have a choice.

I personally would have an if/else statement in the map, for clarity. I would also change the name of the function, and rewrite the isNot part.

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

This is matter of opinion and coding taste, but I find this to be a lot more readable, because you can read the code and understand it straight away. But this is a personal taste.

Upvotes: 3

Debashish
Debashish

Reputation: 311

all() operator can be used.

According to the doc. all() Emits a single boolean true if all values of this sequence match

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

Upvotes: 0

devilKing
devilKing

Reputation: 360

For a predicate which returns a Mono<Boolean>, you can also use filterWhen which takes a publisher as a predicate. Something like this:

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

Upvotes: 5

Related Questions