Отмена выполнения в случае, если один из нескольких Mono пуст

#java #reactor

#java #реактор

Вопрос:

Я новичок в реактивном программировании. Мой код выглядит следующим образом, и я не могу понять, как вернуться Flux.empty() в случае firstService.getEntity(id1) , если и secondService.getEntity(id2) может вернуться Mono.empty()

 public Flux<Entity3> method(UUID id1, UUID id2, SomeEnum value) {
    var entity1Mono = firstService.getEntity(id1).log();   //  <-- Mono<Entity1>
    var entity2Mono = secondService.getEntity(id2).log();  //  <-- Mono<Entity2> 

    // following code should be executed in case entity1Mono AND entity2Mono are not empty
    var parrent = Flux.combineLatest(entity1Mono, entity2Mono, (entity1, entity2) -> /* build a new  entity */); // <-- Flux<Entity3>
    var child = Flux.from(entity2Mono)
                .flatMapIterable(Entity2::getChildren)
                .map(child -> /* build a new entities */); // <-- Flux<Entity3>

    var entity3 = Flux.merge(parrent, child).log();
    return thrirdService.insert(entity3);
}
  

Возможно, приведенный выше код можно было бы более оптимизировать?

Ответ №1:

Мое решение:

 public Flux<Entity3> method(UUID id1, UUID id2, SomeEnum value) {
        var entity1Mono = firstService.getEntity(id1).log();   //  <-- Mono<Entity1>
    var entity2Mono = secondService.getEntity(id2).log();  //  <-- Mono<Entity2> 

    // following code should be executed in case entity1Mono AND entity2Mono are not empty
    var parrent = Flux.combineLatest(entity1Mono, entity2Mono, (entity1, entity2) -> /* build a new  entity */); // <-- Flux<Entity3>
    var child = entity1Mono.hasElement()
            .filter(isExist -> isExist)
            .flatMapMany(aBoolean -> Flux.from(entity2Mono)
                .filter(entity -> CollectionUtils.isNotEmpty(entity.getChildren()))
                .flatMapIterable(Entity2::getChildren)
                .map(child -> /* build a new entities */)
            ); // <-- Flux<Entity3>

    var entity3 = Flux.merge(parrent, child).log();
    return thrirdService.insert(entity3);
}