Во-первых, мутирование объектов в асинхронном (реактивном) мире не очень хорошая идея.
В любом случае, в вашем решении возможные ошибки при сохранении лорема и долорема игнорируются.Вы можете улучшить его следующим образом:
Mono<FooBar> fooBarMono = findFooBar()
.flatMap(fooBar -> Flux.merge(
createAndSaveLoremBar(fooBar),
createAndSaveDoloremBar(fooBar)) // asynchronously saving lorem and dolorem
.then(Mono.fromCallable(() -> { // if there wasn't errors, mutate and save fooBar
fooBar.setActive(true);
return fooBar;
}).flatMap(fooBar1 -> saveFooBar(fooBar1))));
Если бы вы могли создать копию вашего fooBar
с истинным флагом active
, код мог бы быть проще.Например, с помощью lombok.
@Builder(toBuilder = true)
public class FooBar {
...
}
Mono<FooBar> fooBarMono = findFooBar()
.flatMap(fooBar -> Flux.merge(
createAndSaveLoremBar(fooBar),
createAndSaveDoloremBar(fooBar))
.then(saveFooBar(fooBar.toBuilder().active(true).build())));
И если вас не интересует результат вашего saveFooBar(...)
, а только сигнал завершения, вы можете сделать все три сохранения асинхронно:
Flux<Object> flux = findFooBar()
.flatMapMany(fooBar -> Flux.merge(
createAndSaveLoremBar(fooBar),
createAndSaveDoloremBar(fooBar),
saveFooBar(fooBar.toBuilder().active(true).build())));
На самом деле, в последнем подходе вы могли бы собрать все три результата, и вы должны предпочесть этот подход, но у меня недостаточно информации о ваших классах и требованиях для создания полного примера.