应用flatMap()后如何保持列表的顺序?

时间:2014-12-08 09:33:10

标签: java rx-java

对api.bookings的调用以预定义的顺序返回预订列表。对api.order()的调用会返回一个预订,但会有一些额外的信息。应用flatMap()后,预订列表的顺序搞砸了。 (bookings.toList()只是一个列表,如果预订)。如何按照.from(bookings.toList())发出的顺序获取zip函数中的值。注意:我不能使用toSortedList,因为我无法比较两个预订。

bookingsSubscription = api.bookings()
                    .flatMap(bookings -> 
                        Observable.zip(
                            Observable 
                                .from(bookings.toList()) 
                                .flatMap(booking -> api.order(booking.orderId)),

                            Observable.from(bookings.toList()),

                            (newBooking, oldBooking) -> {
                               // at this point newBooking != oldBooking
                            }
                    ).toList())
                    .subscribe(callback);

api.order

3 个答案:

答案 0 :(得分:7)

concatMap将起作用,但不会提供您想要的并发性。另一方面concatMapEager会。

等效选项是手动创建List<Observable>并使用Observable.zip(Iterable, FuncN)来组合列表。这与concatMapEager具有相同的效果。

请参阅RxJava issue 3017进行讨论。

答案 1 :(得分:3)

答案 2 :(得分:0)

api.bookings()是否会返回热或冷观察?由于你遇到的问题,我觉得你的情况很冷。由于它是一个冷可观察,预订序列执行两次(并且zip运营商执行的所有订阅之间不共享状态)

首先,您可以使代码更简单易懂。您执行.toList()时会删除Observable.from方法调用,这会使您的列表“变平”。

bookingsSubscription = api.bookings()
                .flatMap(coldBookings -> {
                    ConnectableObservable bookings = coldBooking.publish(); 
                    Observable zip = Observable.zip(
                        bookings.flatMap(booking -> api.order(booking.orderId)),
                        bookings,
                        (newBooking, oldBooking) -> {
                           // ...
                    });
                    bookings.connect();
                    return zip.toList();
                })
                .subscribe(callback);

我做了什么:删除无用的Observable.from(obs.toList())并直接使用observable。 使用publish/connect方法将冷可观察量转换为热可观察量

您可以在此处获取有关热/冷可观察的更多信息:http://www.introtorx.com/content/v1.0.10621.0/14_HotAndColdObservables.html