java-RxJava:如何将对象列表转换为另一个对象列表
我有SourceObjects列表,我需要将其转换为ResultObjects列表。
我可以使用ResultObject的方法将一个对象获取到另一个对象:
convertFromSource(srcObj);
我当然可以这样:
public void onNext(List srcObjects) {
List resObjects = new ArrayList<>();
for (SourceObject srcObj : srcObjects) {
resObjects.add(new ResultsObject().convertFromSource(srcObj));
}
}
但对于能够展示如何使用rxJava进行相同操作的人,我将不胜感激。
8个解决方案
69 votes
如果您的Observable发出27059308637407160160,则可以使用以下运算符:
Observable source = ...
source.flatMapIterable(list -> list)
.map(item -> new ResultsObject().convertFromSource(item))
.toList()
.subscribe(transformedList -> ...);(将您的列表转换为可观察项)
Observable source = ...
source.flatMapIterable(list -> list)
.map(item -> new ResultsObject().convertFromSource(item))
.toList()
.subscribe(transformedList -> ...);(将您的商品转换为其他商品)
Observable source = ...
source.flatMapIterable(list -> list)
.map(item -> new ResultsObject().convertFromSource(item))
.toList()
.subscribe(transformedList -> ...);运算符(将完成的Observable转换为Observable,以从完成的Observable发出项目列表)
Observable source = ...
source.flatMapIterable(list -> list)
.map(item -> new ResultsObject().convertFromSource(item))
.toList()
.subscribe(transformedList -> ...);
dwursteisen answered 2020-01-17T01:16:11Z
56 votes
如果要维护源Observable发出的Observable.fromIterable(),但要转换内容(即toList()到Observable>),则可以执行以下操作:
Observable> source = ...
source.flatMap(list ->
Observable.fromIterable(list)
.map(item -> new ResultsObject().convertFromSource(item))
.toList()
.toObservable() // Required for RxJava 2.x
)
.subscribe(resultsList -> ...);
这样可以确保以下几点:
保持Observable发出的Observable.fromIterable()的数量。 即如果源发出3个列表,则另一端将有3个转换后的列表
使用Observable.fromIterable()将确保内部Observable终止,以便可以使用toList()
Noel answered 2020-01-17T01:16:44Z
10 votes
Observable.from()工厂方法允许您将对象的集合转换为Observable流。 一旦有了流,就可以使用地图运算符转换每个发射的项目。 最后,您将必须订阅生成的Observable才能使用转换后的项:
// Assuming List srcObjects
Observable resultsObjectObservable = Observable.from(srcObjects).map(new Func1() {
@Override
public ResultsObject call(SourceObject srcObj) {
return new ResultsObject().convertFromSource(srcObj);
}
});
resultsObjectObservable.subscribe(new Action1() { // at this point is where the transformation will start
@Override
public void call(ResultsObject resultsObject) { // this method will be called after each item has been transformed
// use each transformed item
}
});
如果使用lambda,则缩写形式如下所示:
Observable.from(srcObjects)
.map(srcObj -> new ResultsObject().convertFromSource(srcObj))
.subscribe(resultsObject -> ...);
murki answered 2020-01-17T01:17:09Z
4 votes
就像这样,不要破坏链条。
Observable.from(Arrays.asList(new String[] {"1", "2", "3", }))
.map(s -> Integer.valueOf(s))
.reduce(new ArrayList, (list, s) -> {
list.add(s);
return list;
})
.subscribe(i -> {
// Do some thing with 'i', it's a list of Integer.
});
AtanL answered 2020-01-17T01:17:29Z
0 votes
如果您需要的只是List至List,而无需操纵List的结果。
最干净的版本是:
List a = ... // ["1", "2", ..]
List b = Observable.from(a)
.map(a -> new B(a))
.toList()
.toBlocking()
.single();
saiday answered 2020-01-17T01:17:53Z
0 votes
作为Noel很好答案的延伸。假设转换还取决于订阅期间可能更改的某些服务器数据。 在这种情况下,请使用flatMap + scan。
结果,当id列表更改时,转换将重新开始。 当与特定ID相关的服务器数据更改时,单个项目也将重新转换。
fun getFarmsWithGroves(): Observable> {
return subscribeForIds() //may change during subscription
.switchMap { idList: Set ->
Observable.fromIterable(idList)
.flatMap { id: String -> transformId(id) } //may change during subscription
.scan(emptyList()) { collector: List, candidate: FarmWithGroves ->
updateList(collector, candidate)
}
}
}
Andrew answered 2020-01-17T01:18:18Z
0 votes
使用嵌套映射功能进行非阻塞转换
val ints: Observable> = Observable.fromArray(listOf(1, 2, 3))
val strings: Observable> = ints.map { list -> list.map { it.toString() } }
tomrozb answered 2020-01-17T01:18:38Z
-1 votes
您可以使用地图运算符。 例如,如果您有整数列表,并且想要转换为双精度列表:
List li = new ArrayList<>();
Observable.just(li).map( l -> {
List lr = new ArrayList();
for(Integer e:l) {
lr.add(e.doubleValue());
}
return lr;
});
但是,如果您可以控制可观察对象并将其更改为观察单个元素而不是集合,则自然而然地多了。 将单整数元素转换为双整数的相同代码:
Observable.just(1,2,3).map( elem -> elem.doubleValue())
lujop answered 2020-01-17T01:19:03Z