Как обновить Mono ‹Bar› на основе условия в Mono ‹Foo›?

У меня есть приведенный ниже код из ответа, приведенного в этом [ stackoverflow question]

bars = bars.flatMap(bar -> findByBarId(bar.getBarId())
                    .flatMap(foo -> {
                         bar.setIsInFoo(true);
                         return Mono.just(bar);
                    }).switchIfEmpty(Mono.just(bar)));

Как это сделать, если у меня был единственный Mono<Bar> bar Mono<Foo> foo вместо варианта Flux, описанного выше, и чтобы получить измененную панель?


person ace    schedule 17.06.2018    source источник


Ответы (1)


Точно такая же логика должна применяться независимо от того, начинаете ли вы с Mono<Bar> bar или Flux<Bar> bars. Код можно немного упростить внутри первого flatMap, чтобы использовать map и defaultIfEmpty, чтобы избежать накладных расходов на промежуточный Monos:

Mono<Bar> source;
Mono<Bar> updated = source
    .flatMap(bar -> findByBarId(bar.getBarId())
        .map(foo -> {
            bar.setIsInFoo(true);
            return bar;
         })
        .defaultIfEmpty(bar)
    );
person Simon Baslé    schedule 19.06.2018
comment
так как bar относится к типу Mono ‹Bar›, а не к типу Bar, я получаю ошибку компилятора: getBarId не определен на панели. Как это исправить? - person ace; 19.06.2018
comment
Также defaultIfEmpty (bar) не будет работать, потому что bar имеет тип Mono ‹Bar›, а не тип Bar, который ожидается от defaultIfEmpty. - person ace; 19.06.2018
comment
отредактировал соответственно, теперь source яснее, и это Mono<Bar>, а не Bar - person Simon Baslé; 19.06.2018