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

时间:2016-06-11 06:19:21

标签: javascript rx-java

让我们说我有一个可观察的 Observable<List<A>>我希望将其转换为Observable<List<B>>的Observable。有没有最好的方法将List<A>转换为List<B>。 Javascript&#39; s map就像实施一样,是理想的情况。

3 个答案:

答案 0 :(得分:4)

您可以使用Observable.from(Iterable<A>)获取Observable<A>,将其映射(A =&gt; B),然后使用List<B>转换为Observable.toList()

Observable.from(Arrays.asList(1, 2, 3))
.map(val -> mapIntToString(val)).toList()

E.g。

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

产量

  

[1mapped,2mapped,3mapped]

答案 1 :(得分:3)

我在这里回答了另一个类似的问题: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 -> ...);

这确保了以下几点:

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

答案 2 :(得分:0)

你也可以使用撰写来获得一个可观察的,并会返回不同的颜色。

Observable.Transformer<Integer, String> transformIntegerToString() {
    return observable -> observable.map(String::valueOf);
   }


  @Test
public void observableWithTransformToString() {
    Observable.from(Arrays.asList(1,2,3))
              .map(number -> {
                  System.out.println("Item is Integer:" + Integer.class.isInstance(number));
                  return number;
              })
              .compose(transformIntegerToString())
              .subscribe(number -> System.out.println("Item is String:" + (String.class.isInstance(number))));

}

您可以在此处查看更多示例

https://github.com/politrons/reactive