Как я могу использовать Mono <Boolean>в качестве условия для вызова второго метода - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь позвонить одной службе после проверки состояния другой службы

итеративным способом, я могу сделать это

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))
     ...

Какой правильный способ решить такую ​​ситуацию?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Для предиката, который возвращает Mono<Boolean>, вы также можете использовать filterWhen, который принимает издателя в качестве предиката. Как то так:

Flux<Properties> properties = Mono.just(productId)
.filterWhen(prodId -> productService.isProductNotExcluded(prodId))
.map(validProductId -> propertiesService.getProductDetailProperties(validProductId));   
0 голосов
/ 23 апреля 2020

то, что вы делаете, не странно, я лично не вернул бы логическое значение в реактивной функции Mono<Boolean>, если бы я мог избежать этого, но это не так, и иногда у вас нет выбора.

Для ясности лично у меня было бы заявление if else на карте. И я бы изменил название функции и переписал isNot часть.

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

Это вопрос мнения и вкуса кодирования, но я считаю, что это гораздо более читабельно, потому что вы можете Прочитайте код и сразу поймите его. Но это личный вкус.

...