将2个RxJava观测值转换为1个映射
我有下面的场景。我正在使用2从服务器获取数据。 我想下载将2个RxJava观测值转换为1个映射,java,dictionary,stream,rx-java,Java,Dictionary,Stream,Rx Java,我有下面的场景。我正在使用2从服务器获取数据。 我想下载账户实体的集合,并为每个账户下载项目实体的集合。最后,我想获得映射帐户swithprojects 我有以下方法: 可观察的请求AllAccounts() 可观察的请求项目sinfofortempoaccount(Account Account) 问题:是否可以压缩或创建这两个反应流的每次迭代,并将所有项目收集到地图上 如果有帮助的话,我还可以同步获取帐户的项目集合,但是不能在主线程上完成,因为为Android开发,结果必须在主线程上观察。你
账户
实体的集合
,并为每个账户下载项目
实体的集合
。最后,我想获得映射帐户swithprojects
我有以下方法:
可观察的请求AllAccounts()
可观察的请求项目sinfofortempoaccount(Account Account)
requestAllAccounts().flatMap(new Func1<Collection<Account>, Observable<Account>>() {
@Override
public Observable<Account> call(Collection<Account> accountCollection) {
return Observable.from(accountCollection);
}
}).flatMap(new Func1<Account, Observable<Pair<Account, Collection<Project>>>>() {
@Override
public Observable<Pair<Account, Collection<Project>>> call(Account account) {
return Observable.just(account).zipWith(requestProjectsInfoForTempoAccount(account),
new Func2<Account, Collection<Project>, Pair<Account, Collection<Project>>>() {
@Override
public Pair<Account, Collection<Project>> call(Account account, Collection<Project> projects) {
return new Pair<Account, Collection<Project>>(account, projects);
}
});
}
}).toList()
.flatMap(new Func1<List<Pair<Account, Collection<Project>>>, Observable<Map<Account, Collection<Project>>>>() {
@Override
public Observable<Map<Account, Collection<Project>>> call(List<Pair<Account, Collection<Project>>> pairs) {
Map<Account, Collection<Project>> map = new HashMap<Account, Collection<Project>>();
for (Pair<Account, Collection<Project>> pair : pairs) {
map.put(pair.first, pair.second);
}
return Observable.just(map);
}
});
requestAllAccounts().flatMap(新Func1()){
@凌驾
公共可观察呼叫(集合帐户集合){
从(accountCollection)可观察到的返回;
}
}).flatMap(新函数1(){
@凌驾
公众可观察电话(账户){
返回可观察的.just(account).zipWith(requestProjectsInfoForTempoAccount(account),
新功能2(){
@凌驾
公共对呼叫(帐户、集合项目){
返回新对(帐户、项目);
}
});
}
})托利斯先生()
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(列表对){
Map Map=newhashmap();
for(成对:成对){
地图放置(成对第一,成对第二);
}
返回可观察的。刚(地图);
}
});
这是怎么回事
对
列表
转换为映射
requestAllAccounts().flatMap(new Func1<Collection<Account>, Observable<Account>>() {
@Override
public Observable<Account> call(Collection<Account> accountCollection) {
return Observable.from(accountCollection);
}
}).flatMap(new Func1<Account, Observable<Pair<Account, Collection<Project>>>>() {
@Override
public Observable<Pair<Account, Collection<Project>>> call(Account account) {
return Observable.just(account).zipWith(requestProjectsInfoForTempoAccount(account),
new Func2<Account, Collection<Project>, Pair<Account, Collection<Project>>>() {
@Override
public Pair<Account, Collection<Project>> call(Account account, Collection<Project> projects) {
return new Pair<Account, Collection<Project>>(account, projects);
}
});
}
}).toList()
.flatMap(new Func1<List<Pair<Account, Collection<Project>>>, Observable<Map<Account, Collection<Project>>>>() {
@Override
public Observable<Map<Account, Collection<Project>>> call(List<Pair<Account, Collection<Project>>> pairs) {
Map<Account, Collection<Project>> map = new HashMap<Account, Collection<Project>>();
for (Pair<Account, Collection<Project>> pair : pairs) {
map.put(pair.first, pair.second);
}
return Observable.just(map);
}
});
requestAllAccounts().flatMap(新Func1()){
@凌驾
公共可观察呼叫(集合帐户集合){
从(accountCollection)可观察到的返回;
}
}).flatMap(新函数1(){
@凌驾
公众可观察电话(账户){
返回可观察的.just(account).zipWith(requestProjectsInfoForTempoAccount(account),
新功能2(){
@凌驾
公共对呼叫(帐户、集合项目){
返回新对(帐户、项目);
}
});
}
})托利斯先生()
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(列表对){
Map Map=newhashmap();
for(成对:成对){
地图放置(成对第一,成对第二);
}
返回可观察的。刚(地图);
}
});
这是怎么回事
对
列表
转换为映射
requestAllAccounts()
.flatMap(account -> requestProjectsInfoForTempoAccount(account),
(acccount, projects) -> Pair::of)
.toMap(Pair::key, Pair::value);
(将扩展到Java 7作为读者的练习)这里有一个更好的方法:
requestAllAccounts()
.flatMap(account -> requestProjectsInfoForTempoAccount(account),
(acccount, projects) -> Pair::of)
.toMap(Pair::key, Pair::value);
(扩展到Java 7留给读者作为练习)谢谢,我只想解决一个问题:您创建的observable正在发出许多
Map
实例。每个实例只有一个Map.Entry。有没有办法在订阅之前将它们合并到一个地图中?你确定吗?如果函数requestAllAccounts()
和requestProjectsInfoForTempoAccount(Account Account)
只返回一次集合(一次onNext(…)
call),则应能按预期工作。是的,很抱歉,您是对的。我试图用lambdas重写它,结果弄糟了一些东西。再次感谢!谢谢,我只想解决一个问题:您创建的可观察对象正在发出许多Map
实例。每个实例只有一个Map.Entry。有没有办法在订阅之前将它们合并到一个地图中?你确定吗?如果函数requestAllAccounts()
和requestProjectsInfoForTempoAccount(Account Account)
只返回一次集合(一次onNext(…)
call),则应能按预期工作。是的,很抱歉,您是对的。我试图用lambdas重写它,结果弄糟了一些东西。再次感谢!