java修改其他对象的list_java-RxJava:如何将对象列表转换为另一个对象列表

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值