Java 对列表应用flatMap()后,如何保持列表的顺序?
调用api.bookings将按预定义顺序返回预订列表。调用api.order将返回一个预订,但包含一些额外的信息。应用flatMap后,预订列表的顺序变得混乱。toList只是一个预订列表。如何按照.frombookings.toList发出的顺序获取zip函数中的值。注意:我无法使用toSortedList,因为我无法比较两次预订Java 对列表应用flatMap()后,如何保持列表的顺序?,java,rx-java,Java,Rx Java,调用api.bookings将按预定义顺序返回预订列表。调用api.order将返回一个预订,但包含一些额外的信息。应用flatMap后,预订列表的顺序变得混乱。toList只是一个预订列表。如何按照.frombookings.toList发出的顺序获取zip函数中的值。注意:我无法使用toSortedList,因为我无法比较两次预订 bookingsSubscription = api.bookings() .flatMap(bookings ->
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.orderapi.bookings返回的是热订单还是冷订单?我认为你的情况是感冒,因为你遇到了这个问题。由于它是一个冷可观察的对象,bookings序列被执行两次,并且状态不会在zip操作符执行的所有订阅之间共享
首先,代码可以更简单,更容易理解。您可以在执行Observable.toList时删除.toList方法调用,从中“展平”列表
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.fromobs.toList并直接使用Observable。
使用发布/连接方法将冷可观测转换为热可观测
您可以在此处获得有关热/冷观测的更多信息:使用.concatMap而不是.flatMap
concatMap可以工作,但不会提供您想要的并发性。另一方面,ConcatmaPagenger会
一个等效的选项是手动创建一个列表,并使用Observable.zipitable,FuncN组合该列表。这将具有与concatMapEager相同的效果
请参阅以进行讨论。谢谢。这是一种奇怪的concatmapanger提示顺序文档,但是,比方说,flatMapSingle我的案例的文档,它处理Observable.from iterable发出的项目,却毫无意义。容易出错。