java - RxJava迭代对象中的列表并返回对象

标签 java android rx-java2

需要执行 API 请求并下载响应中返回的所有资源。 我有下面的逻辑,但不确定完成此操作的正确方法是什么。

 public Observable<Response> prepareSomething() {
    return api.requestSomthing()
            .observeOn(Schedulers.io())
            .flatMap(response -> Observable.fromIterable(response.getAssetsList()))
            .map(asset -> downloadAsset(asset, response.getSomeValue/*how?*/))
            .someRxOperatorToRetrunResponseObject(/*how?*/);
}

我实际上找到了一种通过以下方式实现它的方法:

public Observable<Response> prepareSomething() {
    return api.requestSomthing()
            .observeOn(Schedulers.io())
            .flatMap(response -> {
                ArrayList<Observable<Asset>> observables = new ArrayList<>();
                for(Asset asset : response.getAssetsList()){
                    Observable downloadOb = Observable.just(asset)
                            .map(assetToDownload-> downloadAsset(assetToDownload, response.getSomeValue()));
                    observables.add(downloadOb);
                }

                return Observable.zip(observables, objects -> response);
            });
}

但它看起来不太好。如果有人可以帮助改进这一点,我们将不胜感激。

最佳答案

我会将下载逻辑嵌套到内部 Observable 中

public Observable<Response> prepareSomething() {
        return api.requestSomthing()
                .observeOn(Schedulers.io())
                .flatMap(response -> Observable.fromIterable(response.getAssetsList())
                        .flatMap( asset -> downloadAsset(asset))
                        .toList()
                        .flatMapObservable(downloadedAssets -> Observable.just(response))
                );
    }

您可以访问同一 lambda 中的响应和下载的资源

关于java - RxJava迭代对象中的列表并返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50937183/

相关文章:

java - 如何使用 SAX 解析器删除 xml 命名空间

java - 扫描仪 - 管理文本文件的输入

android - Android模拟器中上网

android - 如何像 iOS 一样在 Android 中实现裁剪功能?

java - 带有按钮的 Android Eclipse 弹出消息

java - 处理RxJava即时搜索时中断异常

java - RX java 在添加项目时发出延迟的列表项目

java - 可以使用 ObjectUtils.identityToString() 检查对象 null

java - Hbase客户端连接失败

android - 如何从 Observable 获取多种数据类型,因为仅接受 Observable<T> 的一种泛型类型