RxJava1:如何将 Observable<List<Observable<X>>> 转换为 Observable<List<X>>

RxJava1: How to convert Observable<List<Observable<X>>> to Observable<List<X>>

有人可以帮我找到解决我面临的这个问题的正确方法吗?

  1. 我有一个后端服务可以提供 Observables 我需要的数据,它们是 Events
  2. 形成事件我可以得到一个 EventGroup,其中包含同一组中所有事件的 ID。
  3. 接下来我可以获得属于该组的所有 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 }