我是RxJava的新手。我想从给定集合中为每个TempoAccount
实体下载一些数据,并将它们全部存储在地图accountsWithProjects
中。完成上一个onNext(TempoAccount tempoAccount)
的代码后,我想调用filterAccountsWithProjects(accountsWithProjects)
方法。是否有一些简单的方法来实现它?
private void getProjectsForEachTempoAccount(Collection<TempoAccount> tempoAccounts) {
final Map<TempoAccount, Collection<TempoProject>> accountsWithProjects =
new HashMap<>(tempoAccounts.size());
Observable<TempoAccount> accountsObservable = Observable.from(tempoAccounts);
accountsObservable
.compose(ObservableUtils.applySchedulers())
.subscribe(new ObserverAdapter<TempoAccount>() {
@Override
public void onError(Throwable e) {
view.notifyAboutError(e.getMessage());
}
@Override
public void onNext(TempoAccount tempoAccount) {
jira.requestProjectsInfoForTempoAccount(String.valueOf(tempoAccount.getId()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ObserverAdapter<Collection<TempoProject>>() {
@Override
public void onError(Throwable e) {
view.notifyAboutError(e.getMessage());
}
@Override
public void onNext(Collection<TempoProject> projects) {
accountsWithProjects.put(tempoAccount, projects);
}
});
}
@Override
public void onCompleted() {
filterAccountsWithProjects(accountsWithProjects);
}
});
}
问题:在上面的代码filterAccountsWithProjects(accountsWithProjects)
中,onNext(TempoAccount tempoAccount)
的所有可观察对象都已完成。
修改
我想创建一个这样类型的Observable:Observable<Map<TempoAccount, Collection<TempoProject>>
。
我有两个可观测量:
Observable<TempoAccount> accountsObservable = Observable.from(tempoAccounts)
Observable<Collection<TempoProject>> projectsForAccountObservable = jira.requestProjectsInfoForTempoAccount(TempoAccount account)
所以我的问题是:我可以用某种方式连接它们并创建具有这两个可观察量的地图。
答案 0 :(得分:1)
您应该使用原始信息流上的flatMap()
功能执行您当前在onNext()
中执行的操作。此外,您无需在onComplete()
中过滤流。您可以在流本身上使用filter()
并以更“反应”的方式处理问题。
以下是一个例子:
accountsObservable
.compose(ObservableUtils.applySchedulers())
.map(tempoAccount -> new Pair<TempoAccount, Collection<TempoProject>>(tempoAccount, fetchInfoAccountForTempoAccount(tempoAccount)))
.filter(pair -> hasProjects(pair))
.toMap(pair -> pair.first(), pair -> pair.second)
.subscribe(...)
修改强>
更新了建议的答案 - 您获得了TempoAccount
,然后将每个帐户映射到Pair
帐户和TempoProject
的集合。您可以过滤这些对以查看是否有任何项目,然后使用toMap()
创建所需的结果。请注意,要使toMap()
正常工作,您的观察者必须在到达流末尾时调用onComplete()
。