RxJava1:如何转换Observable <list <observable <x>&gt;&gt;到Observable <list <x>&gt;

时间:2017-06-22 21:54:11

标签: rx-java rx-kotlin

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

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

2 个答案:

答案 0 :(得分:1)

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都是有限的。

答案 1 :(得分:0)

我想出来了,灵感来自@akarnokd的回答。 @akarnokd回答期望所有来源都是有限的,但我的都是无限的。但是我也可以忍受部分无限。

我需要生成的Observable无限,因为每当Events发出某些内容时,我都希望收到eventProvider.observable的新列表。但是,我对通过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 }