反应堆项目组成 Flux.zip()

Project Reactor composing Flux.zip()

我一直在尝试通过这个小应用程序学习 Project Reactor 3.0。我正在努力编写一个 Flux.zip() 函数来将变量组合到 Movie 对象。在 Reactor 中,return 类型似乎是 Flux<Tuple5<>>。在 RxJava2 中它 return 是一个 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));

而不是 returning a Flux<Tuple5<>> 我想 return a Tuple5<> 或其他东西来像 RxJava 一样创建电影。我不想订阅元组,因为我试图在 Spring Web Reactive 中 return 这个。我通过订阅暂时解决了,但我想知道是否可以像RxJava一样做。

this video 中时间戳 1:07:54 中的示例表明它在旧版本中是可能的。

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

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

相当

所以你想要的是 Flux<Movie>zip 有一个将 Function<Object[], V> 作为第一个参数的重载:它允许您指定要将来自压缩源的值组合到哪个对象 V 中。该函数将应用这些值的数组作为输入,并且必须 return 要在结果 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));