让我们说我有一个可观察的
Observable<List<A>>
我希望将其转换为Observable<List<B>>
的Observable。有没有最好的方法将List<A>
转换为List<B>
。 Javascript&#39; s map
就像实施一样,是理想的情况。
答案 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))));
}
您可以在此处查看更多示例