【问题标题】:How to Transform Observable<Observable<List<T>>> to Observable<List<T>>如何将 Observable<Observable<List<T>>> 转换为 Observable<List<T>>
【发布时间】:2017-04-30 22:38:14
【问题描述】:

我被困在如何将以下可观察类型转换/转换为我的目标类型:

我有可观察的类型:

Observable<Observable<List<FooBar>>>

我想把它转换成:

Observable<List<FooBar>>

所以当我订阅它时,它会发出 List&lt;FooBar&gt; 而不是 Observable&lt;List&lt;FooBar&gt;&gt;

我尝试使用 map、flatMap...我找不到解决方案。

但是,我发现了一个名为 blockingFirst 的奇怪运算符,我的 IDE 表明它在应用于 Observable&lt;Observable&lt;List&lt;FooBar&gt;&gt;&gt; 时返回 Observable&lt;List&lt;FooBar&gt;&gt;

但“阻塞”部分让我感到困惑。

我也在寻找比 blockingFirst 更好的解决方案,如果有的话。

【问题讨论】:

    标签: java rx-java reactive-programming rx-java2


    【解决方案1】:

    flatMap 确实是要走的路:

    Observable<Observable<List<FooBar>>> streamOfStreams = ...
    Observable<List<FooBar>> listStream = 
              streamOfStreams.flatMap(listObservable -> listObservable);
    

    我认为你应该换个角度看,从一种类型转换为另一种类型并不简单。 ObservableObservables 表示发出流的流,每个流发出一些项目的列表。您想要实现的是将其展平为从所有流中发出所有列表的单个流。
    flatMap 准确地做到这一点,你给它一个项目发射,并返回一个ObservableflatMap 将订阅返回的Observable 并将从它发出的每个项目合并到源流中,在这种情况下,因为您只需返回每个发出的项目Observable&lt;List&lt;FooBar&gt;&gt;,您实际上获取每个发出的Observable,订阅它,并将其所有列表排放合并回来,这样您就可以从所有Observables 中获取所有列表的流。

    blockingFirst 绝对不是要走的路,它所做的是等待(阻止)直到第一次发射并仅返回此项目,因为您的项目 ar Observable&lt;List&lt;FooBar&gt;&gt; 您将获得唯一的第一个 Observable。因此,虽然它确实具有相同的类型,但它显然不是您想要的相同流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多