将2个RxJava观测值转换为1个映射

将2个RxJava观测值转换为1个映射,java,dictionary,stream,rx-java,Java,Dictionary,Stream,Rx Java,我有下面的场景。我正在使用2从服务器获取数据。 我想下载账户实体的集合,并为每个账户下载项目实体的集合。最后,我想获得映射帐户swithprojects 我有以下方法: 可观察的请求AllAccounts() 可观察的请求项目sinfofortempoaccount(Account Account) 问题:是否可以压缩或创建这两个反应流的每次迭代,并将所有项目收集到地图上 如果有帮助的话,我还可以同步获取帐户的项目集合,但是不能在主线程上完成,因为为Android开发,结果必须在主线程上观察。你

我有下面的场景。我正在使用2从服务器获取数据。 我想下载
账户
实体的
集合
,并为每个账户下载
项目
实体的
集合
。最后,我想获得
映射帐户swithprojects

我有以下方法:

  • 可观察的请求AllAccounts()
  • 可观察的请求项目sinfofortempoaccount(Account Account)
  • 问题:是否可以压缩或创建这两个反应流的每次迭代,并将所有项目收集到地图上

    如果有帮助的话,我还可以同步获取帐户的项目集合,但是不能在主线程上完成,因为为Android开发,结果必须在主线程上观察。

    你有了它:

    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重写它,结果弄糟了一些东西。再次感谢!