【问题标题】:RxJava1: How to convert Observable<List<Observable<X>>> to Observable<List<X>>RxJava1:如何将 Observable<List<Observable<X>>> 转换为 Observable<List<X>>
【发布时间】:2017-06-22 21:54:10
【问题描述】:

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

  1. 我有一个后端服务,可以为我提供Observables 我需要的数据,即Events
  2. 形成事件我可以得到一个EventGroup,其中包含同一组中所有事件的ID。
  3. 接下来我可以获得属于该组的所有Events。

但是,我得到了一个Observable&lt;List&lt;Observable&lt;Event&gt;&gt;&gt;,我想在哪里得到一个Observable&lt;List&lt;Event&gt;&gt;。在不实际订阅嵌套的Observables 的情况下,如何实现这一点?

val events : Observable<List<Observable<Event>>> = 
   eventProvider.observable
      .flatMap { myBackend.getEventGroup(it.eventGroupId) }
      .map { 
         it.eventIds.map { myBackend.getEvent(it) } 
      }

TL:DR

如何从Observable&lt;List&lt;Observable&lt;X&gt;&gt;&gt; 获得Observable&lt;List&lt;X&gt;&gt;

【问题讨论】:

    标签: rx-java rx-kotlin


    【解决方案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 都是有限的。

    【讨论】:

    • 所有Observables 都是无限的,所以我不能直接使用你的方法。但是,您的回答确实将我引向了我需要的方向,因为我可以将 Observables 转换为有限的。谢谢:)
    【解决方案2】:

    受@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 }
    

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多