如何将 Observable<Observable<List<T>>> 转换为 Observable<List<T>>
How to Transform Observable<Observable<List<T>>> to Observable<List<T>>
我一直在思考如何将以下可观察类型 convert/transform 转换为我的目标类型:
我有以下类型的可观察对象:
Observable<Observable<List<FooBar>>>
我想将其转换为:
Observable<List<FooBar>>
所以当我订阅它时,它发出 List<FooBar>
而不是 Observable<List<FooBar>>
我尝试了地图、平面地图...我找不到解决方案。
但是,我发现了一个名为 blockingFirst
的奇怪运算符,我的 IDE 表明它 returns Observable<List<FooBar>>
当应用于 Observable<Observable<List<FooBar>>>
但是 'blocking' 部分让我感到困惑。
我也在寻找比 blockingFirst
更好的解决方案(如果有的话)。
flatMap
确实是要走的路:
Observable<Observable<List<FooBar>>> streamOfStreams = ...
Observable<List<FooBar>> listStream =
streamOfStreams.flatMap(listObservable -> listObservable);
我觉得你应该换个角度来看待它,从一种类型转换成另一种类型并不简单。 Observables
的 Observable
表示发出流的流,每个流都发出一些项目的列表。你想要实现的是将它展平为单个流,从所有流中发出所有列表。
flatMap
准确地做到这一点,你给它一个项目发射,return 一个 Observable
,flatMap
将订阅 returned Observable
和将从它发出的每个项目合并到源流,在这种情况下,因为你只是 return 每个项目发射 Observable<List<FooBar>>
,你实际上接受每个发射的 Observable
,订阅它,并将其所有列表排放合并回来,这样您就可以从所有 Observables
.
中获取所有列表的流
blockingFirst
绝对不是要走的路,它所做的是等待(阻塞)直到第一次发射并且 return 只有这个项目,因为你的项目是 Observable<List<FooBar>>
你就拿唯一的第一个Observable
。所以虽然它确实具有相同的类型,但它显然不是您想要的相同流。
我一直在思考如何将以下可观察类型 convert/transform 转换为我的目标类型:
我有以下类型的可观察对象:
Observable<Observable<List<FooBar>>>
我想将其转换为:
Observable<List<FooBar>>
所以当我订阅它时,它发出 List<FooBar>
而不是 Observable<List<FooBar>>
我尝试了地图、平面地图...我找不到解决方案。
但是,我发现了一个名为 blockingFirst
的奇怪运算符,我的 IDE 表明它 returns Observable<List<FooBar>>
当应用于 Observable<Observable<List<FooBar>>>
但是 'blocking' 部分让我感到困惑。
我也在寻找比 blockingFirst
更好的解决方案(如果有的话)。
flatMap
确实是要走的路:
Observable<Observable<List<FooBar>>> streamOfStreams = ...
Observable<List<FooBar>> listStream =
streamOfStreams.flatMap(listObservable -> listObservable);
我觉得你应该换个角度来看待它,从一种类型转换成另一种类型并不简单。 Observables
的 Observable
表示发出流的流,每个流都发出一些项目的列表。你想要实现的是将它展平为单个流,从所有流中发出所有列表。
flatMap
准确地做到这一点,你给它一个项目发射,return 一个 Observable
,flatMap
将订阅 returned Observable
和将从它发出的每个项目合并到源流,在这种情况下,因为你只是 return 每个项目发射 Observable<List<FooBar>>
,你实际上接受每个发射的 Observable
,订阅它,并将其所有列表排放合并回来,这样您就可以从所有 Observables
.
blockingFirst
绝对不是要走的路,它所做的是等待(阻塞)直到第一次发射并且 return 只有这个项目,因为你的项目是 Observable<List<FooBar>>
你就拿唯一的第一个Observable
。所以虽然它确实具有相同的类型,但它显然不是您想要的相同流。