将一种类型的列表转换为另一种RXJava?(Javascript地图相当于)

Sus*_*ant 7 javascript rx-java

假设我有一个observable Observable<List<A>>,我想把它转换成一个Observable Observable<List<B>>.有没有最好的方式转换List<A>List<B>.Javascript的map实现将是理想的情况.

m.o*_*hov 5

你可以用Observable.from(Iterable<A>)得到Observable<A>,它映射(A => B),并转换为List<B>Observable.toList()

Observable.from(Arrays.asList(1, 2, 3))
.map(val -> mapIntToString(val)).toList()
Run Code Online (Sandbox Code Playgroud)

例如

  Observable.from(Arrays.asList(1, 2, 3))
.map(val -> val + "mapped").toList()
.toBlocking().subscribe(System.out::println);
Run Code Online (Sandbox Code Playgroud)

产量

[1映射,2映射,3映射]


Noe*_*oel 5

我在这里回答了另一个类似的问题:https : //stackoverflow.com/a/42055221/454449

为方便起见,我在这里复制了答案(不确定这是否违反规则):

如果您想保持Lists源发出Observable的内容但将内容转换Observable<List<SourceObject>>Observable<List<ResultsObject>>,您可以执行以下操作:

Observable<List<SourceObject>> source = ...
source.flatMap(list ->
        Observable.fromIterable(list)
            .map(item -> new ResultsObject(item))
            .toList()
            .toObservable() // Required for RxJava 2.x
    )
    .subscribe(resultsList -> ...);
Run Code Online (Sandbox Code Playgroud)

这确保了几件事:

  • Lists发射的数量Observable保持不变。即如果源发出 3 个列表,则另一端将有 3 个转换后的列表
  • 使用Observable.fromIterable()将确保内部Observable终止以便toList()可以使用