Реактор проекта, составляющий Flux.zip()
Я пытался изучить Project Reactor 3.0 с помощью этого небольшого приложения. Я пытаюсь составить функцию Flux.zip() для объединения переменных в объект Movie. В Reactor кажется, что возвращаемый тип Flux<Tuple5<>>
, В RxJava2 он возвращает Function5<>
,
RxJava2
Single<Movie> movie = Single.zip(getDesc(id), getCategory(id), getName(id), getRating(id),
(Function5<Integer, String, String, String, Double, Object>) (desc, cat, name, rating) ->
new Movie(id.blockingGet(), name, desc, cat, rating)).cast(Movie.class);
Реактор
Flux<Tuple5<Integer, String, String, String, Double>> tuple =
Flux.zip(id, getDesc(id), getCategory(id), getName(id), getRating(id));
Вместо возврата Flux<Tuple5<>>
Я хочу вернуть Tuple5<>
или что-то еще, чтобы создать фильм, как RxJava. Я не хочу подписываться на Tuple, так как пытаюсь вернуть это в Spring Web Reactive. Я временно решил это, подписавшись, но мне было интересно, можно ли сделать то же самое, что и RxJava.
Пример в этом видео на отметке времени 1:07:54 показывает, что это было возможно в старой версии.
Любые решения или предложения приветствуются!
1 ответ
Решение RxJava не возвращает Movie
напрямую, но Single<Movie>
, Реактор имеет упрощенный zip
который возвращает Tuple
, но подпись RxJava сравнима с Flux<Tuple5>
,
Так что вы хотите, это Flux<Movie>
, zip
имеет перегрузку, которая занимает Function<Object[], V>
в качестве первого параметра: это позволяет указать, в какой объект V
значения из заархивированных источников должны быть объединены. Функция будет применяться с массивом этих значений в качестве входных данных и должна возвращать значение, которое будет передано в результирующем Flux<V>
в вашем случае Movie
,
Да,Zip
может быть использован. Он ждет, пока источники испустят элемент и объединят их в кортежи. Как показано ниже, издатели указывают имя, фамилию и отдел. который объединяется для формирования потока пользователей.
Flux<String> fnameFlux = Flux.just("Ramesh","Amit","Vijay");
Flux<String> lnameFlux = Flux.just("Sharma","Kumar","Lamba");
Flux<String> deptFlux = Flux.just("Admin","IT","Acc.");
Flux<User> userFlux = Flux.zip(fnameFlux, lnameFlux, deptFlux)
.flatMap(dFlux ->
Flux.just(new User(dFlux.getT1(), dFlux.getT2(), dFlux.getT2())));
userFlux.subscribe(x -> System.out.println(x));