Как бороться с двумя потоками в Spring Reactive Programming? - PullRequest
0 голосов
/ 09 июня 2018

У меня есть два потока

Flux<Foo> foo;
Flux<Bar> bar;

class Foo 
String id
String prop1
String barId


class Bar 
String barId
String color
boolean isInFoo

foo и bar, оба имеют свойство barId.Размер foo всегда равен или меньше размера бара, но обычно он намного меньше, чем размер бара (количество баров во Flux. Например, Foo может представлять несколько выбранных элементов из корзины элементов бара, хотя дваразличные объекты.

Bar имеет логический флаг isInFoo со значением по умолчанию = false, которое устанавливается в значение true, если Foo имеет этот barId.

Как выполнить итерацию по bar и найти, имеет ли каждый барbarId в foo, и если это так, установите для isInFoo значение true.

У меня также есть в наличии

Mono<Foo> findByBarId(String barId) {}

в дополнение к вышеприведенному Flux<Foo> findAll() {}

Обратите внимание, что findByBarId и findAll стоят дорогооперации с базой данных.

1 Ответ

0 голосов
/ 11 июня 2018

Предположим, у вас есть два следующих потока:

Flux<Foo> foos;
Flux<Bar> bars;

Вы можете изменить объекты Flux of Bar следующим образом:

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