Как я могу использовать Mono‹Boolean› как условие для вызова второго метода

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

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

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

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


person Edgar Ferney Ruiz Anzola    schedule 22.04.2020    source источник
comment
Вы можете просто сделать оператор if else в функции map   -  person Toerktumlare    schedule 22.04.2020
comment
Это не странно, что вы делаете. Если вам это не нравится, вы можете использовать решение Томаса Андольфа.   -  person Shoshi    schedule 22.04.2020


Ответы (2)


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

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

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

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

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

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

person Toerktumlare    schedule 22.04.2020
comment
это должно быть flatMap, я считаю - person Martin Tarjányi; 25.04.2020