Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对列表应用flatMap()后,如何保持列表的顺序?_Java_Rx Java - Fatal编程技术网

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

Java 对列表应用flatMap()后,如何保持列表的顺序?,java,rx-java,Java,Rx Java,调用api.bookings将按预定义顺序返回预订列表。调用api.order将返回一个预订,但包含一些额外的信息。应用flatMap后,预订列表的顺序变得混乱。toList只是一个预订列表。如何按照.frombookings.toList发出的顺序获取zip函数中的值。注意:我无法使用toSortedList,因为我无法比较两次预订 bookingsSubscription = api.bookings() .flatMap(bookings ->

调用api.bookings将按预定义顺序返回预订列表。调用api.order将返回一个预订,但包含一些额外的信息。应用flatMap后,预订列表的顺序变得混乱。toList只是一个预订列表。如何按照.frombookings.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

api.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发出的项目,却毫无意义。容易出错。