Реактор проекта, составляющий 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));
Другие вопросы по тегам