2

我一直在尝试用这个小应用程序学习 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));

我不想返回 aFlux<Tuple5<>>我想返回 aTuple5<>或其他东西来创建电影,就像 RxJava 一样。我不想订阅元组,因为我试图在 Spring Web Reactive 中返回它。我通过订阅暂时解决了它,但我想知道是否可以像 RxJava 一样做。

此视频中时间戳为 1:07:54的示例表明它在旧版本中是可能的。

欢迎任何解决方案或建议!

4

2 回答 2

2

RxJava 解决方案不Movie直接返回,而是返回Single<Movie>. Reactor 有一个简化zip的返回 a Tuple,但 RxJava 签名与Flux<Tuple5>.

所以你想要的是一个Flux<Movie>. zip有一个将 aFunction<Object[], V>作为第一个参数的重载:它允许您指定V要将压缩源中的值组合到哪个对象中。该函数将应用这些值的数组作为输入,并且必须返回要在结果中发出的值Flux<V>,在您的情况下为 a Movie

于 2017-05-09T10:24:13.127 回答
1

是的,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));
于 2020-05-05T19:25:51.977 回答