RxJava1:如何将 Observable<List<Observable<X>>> 转换为 Observable<List<X>>
RxJava1: How to convert Observable<List<Observable<X>>> to Observable<List<X>>
有人可以帮我找到解决我面临的这个问题的正确方法吗?
- 我有一个后端服务可以提供
Observables
我需要的数据,它们是 Events
。
- 形成事件我可以得到一个
EventGroup
,其中包含同一组中所有事件的 ID。
- 接下来我可以获得属于该组的所有
Event
。
但是,我得到了一个 Observable<List<Observable<Event>>>
,我想得到一个 Observable<List<Event>>
。如果不实际订阅嵌套的 Observables
?
,我该如何实现呢?
val events : Observable<List<Observable<Event>>> =
eventProvider.observable
.flatMap { myBackend.getEventGroup(it.eventGroupId) }
.map {
it.eventIds.map { myBackend.getEvent(it) }
}
TL:DR
如何从 Observable<List<Observable<X>>>
中获取 Observable<List<X>>
?
两次flatMap然后使用toList:
Observable<List<Observable<X>> source = ...
Observable<Observable<X>> step1 = source.flatMapIterable(v -> v);
Observable<X> step2 = step1.flatMap(v -> v);
Observable<List<X>> result = step2.toList();
请注意,这要求所有参与的 Observable 都是有限的。
我想通了,受到@akarnokd 的回答的启发。 @akarnokd 回答期望所有来源都是有限的,但我的都是无限的。但是我也可以忍受部分无限。
我需要我的结果 Observable
是无限的,因为每当 eventProvider.observable
发出一些东西时我想收到一个新的 Events
列表。但是,我同意通过 myBackend.getEvent(it)
返回的事件充当有限源。
val events : Observable<List<Event>> =
eventProvider.observable
.flatMap { myBackend.getEventGroup(it.eventGroupId) }
.map { it.eventIds.map { myBackend.getEvent(it) } }
.map { it.toObservable().flatMap { it.first() }.toList() }
.flatMap { it }
有人可以帮我找到解决我面临的这个问题的正确方法吗?
- 我有一个后端服务可以提供
Observables
我需要的数据,它们是Events
。 - 形成事件我可以得到一个
EventGroup
,其中包含同一组中所有事件的 ID。 - 接下来我可以获得属于该组的所有
Event
。
但是,我得到了一个 Observable<List<Observable<Event>>>
,我想得到一个 Observable<List<Event>>
。如果不实际订阅嵌套的 Observables
?
val events : Observable<List<Observable<Event>>> =
eventProvider.observable
.flatMap { myBackend.getEventGroup(it.eventGroupId) }
.map {
it.eventIds.map { myBackend.getEvent(it) }
}
TL:DR
如何从 Observable<List<Observable<X>>>
中获取 Observable<List<X>>
?
两次flatMap然后使用toList:
Observable<List<Observable<X>> source = ...
Observable<Observable<X>> step1 = source.flatMapIterable(v -> v);
Observable<X> step2 = step1.flatMap(v -> v);
Observable<List<X>> result = step2.toList();
请注意,这要求所有参与的 Observable 都是有限的。
我想通了,受到@akarnokd 的回答的启发。 @akarnokd 回答期望所有来源都是有限的,但我的都是无限的。但是我也可以忍受部分无限。
我需要我的结果 Observable
是无限的,因为每当 eventProvider.observable
发出一些东西时我想收到一个新的 Events
列表。但是,我同意通过 myBackend.getEvent(it)
返回的事件充当有限源。
val events : Observable<List<Event>> =
eventProvider.observable
.flatMap { myBackend.getEventGroup(it.eventGroupId) }
.map { it.eventIds.map { myBackend.getEvent(it) } }
.map { it.toObservable().flatMap { it.first() }.toList() }
.flatMap { it }