#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);
}