如何变换Observable <observable <list <t>&gt;&gt;到Observable <list <t>&gt;

时间:2017-04-30 22:38:14

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

我坚持如何将以下可观察类型转换/转换为我的目标类型:

我有类型的可观察性:

Observable<Observable<List<FooBar>>>

我想将其转换为:

Observable<List<FooBar>>

因此,当我订阅它时,它会发出List<FooBar>而不是Observable<List<FooBar>>

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

但是,我发现了一个名为blockingFirst的奇怪的运算符,我的IDE指示它在应用于Observable<List<FooBar>>时返回Observable<Observable<List<FooBar>>>

但是&#39;阻止&#39;部分令我困惑。

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

1 个答案:

答案 0 :(得分:5)

flatMap确实是要走的路:

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

我认为你应该从不同的角度看待它,从1种类型转换到另一种类型并不简单。 Observable的{​​{1}}表示发出流的流,每个流都会发出一些项的列表。你想要实现的是将它展平为单个流,从所有流中发出所有列表  Observables完全执行此操作,您为其提供项目排放,并返回flatMapObservable将订阅返回的flatMap,并将从其发出的每个项目合并到源流,在这种情况下,当你只返回Observable的每个项目发射时,你实际上取出每个发出的Observable<List<FooBar>>,订阅它,然后合并它的所有列表排放,所以你得到回流来自所有Observable的所有列表。

Observables绝对不是要走的路,它的作用是等待(阻止)直到第一次发射并仅返回此项目,因为你的物品ar blockingFirst你将获得唯一的第一个Observable<List<FooBar>>。所以虽然它确实具有相同的类型,但它显然不是你想要的流。