gpt4 book ai didi

android - 我是否正确使用 flatMap 来合并来自多个 API 调用的结果?

转载 作者:行者123 更新时间:2023-11-29 19:02:54 28 4
gpt4 key购买 nike

我想调用多个 API(使用三个不同的查询)并合并结果,然后在 onNext() 中显示它们。它正在工作,但我担心 flatMap 对此并不理想。

@GET("www.examle.com/api/data/")
Observable<WebResultsResponse> getWebResults(@Query("param1") String query);

-----

private List<WebResult> resultsList;

private void requestWebResults(String query) {
resultsList.clear();

final Observable<List<WebResult>> observable = MainApplication.apiProvider.getApiProviderA.getWebResults("query1")
.subscribeOn(Schedulers.io())
.flatMap(new Function<WebResultsResponse, ObservableSource<List<WebResult>>>() {
@Override
public ObservableSource<List<WebResult>> apply(WebResultsResponse response) throws Exception {
if(response.getData() != null && response.getData().getResults() != null)
resultsList.addAll(response.getData().getResults());

return MainApplication.apiProvider.getApiProviderA.getWebResults("query2")
.flatMap(new Function<WebResultsResponse, ObservableSource<List<WebResult>>>() {
@Override
public ObservableSource<List<WebResult>> apply(WebResultsResponse response) throws Exception {
if(response.getData() != null && response.getData().getResults() != null)
resultsList.addAll(response.getData().getResults());

return MainApplication.apiProvider.getApiProviderA.getWebResults("query3")
.flatMap(new Function<WebResultsResponse, ObservableSource<List<WebResult>>>() {
@Override
public ObservableSource<List<WebResult>> apply(WebResultsResponse response) throws Exception {
if(response.getData() != null && response.getData().getResults() != null)
resultsList.addAll(response.getData().getResults());

return Observable.just(resultsList);
}
});
}
});
}
})
.observeOn(AndroidSchedulers.mainThread());


observer = new DisposableObserver<List<WebResult>>() {
@Override
public void onNext(List<WebResult> results) {
// do something with results
}

@Override
public void onError(Throwable e) {
}

@Override
public void onComplete() {
}
};

observable.subscribe(observer);
}

flatMap() 的使用是否正确?我能否以某种方式将 resultsList 传递到链中而不是将其声明为全局变量?

最佳答案

如果你不关心哪个先返回,你可以简单地合并它们

Observable<List<WebResult>> observable = MainApplication.apiProvider.getApiProviderA.getWebResults("query1")
.mergeWith(MainApplication.apiProvider.getApiProviderA.getWebResults("query2"))
.mergeWith(MainApplication.apiProvider.getApiProviderA.getWebResults("query3"))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());

在 onNext() 中,您将获得每个结果,因为它是自己的列表,如果您想在所有结果都完成后获得结果,您可以使用

Observable<List<WebResult>> observable = Observable.zip(MainApplication.apiProvider.getApiProviderA.getWebResults("query1"), MainApplication.apiProvider.getApiProviderA.getWebResults("query2"), MainApplication.apiProvider.getApiProviderA.getWebResults("query3"), (webResults, webResults2, webResults3) -> {
List<WebResult> allResults = new ArrayList<>();
allResults.addAll(webResults);
allResults.addAll(webResults2);
allResults.addAll(webResults3);
return allResults;
});

在 onNext() 中,您将获得一次发射,所有结果加在一起

关于android - 我是否正确使用 flatMap 来合并来自多个 API 调用的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48240177/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com