【问题标题】:create one stream of list of observables Rxjava 2创建一个可观察的列表流Rxjava 2
【发布时间】:2017-05-21 12:11:16
【问题描述】:
我有一个 id 列表,并且有一个方法接受一个 id 并返回 Observable<Boolean>,它正在使用该 ID 进行操作,如果成功则返回 true。
假设我有用户 id (1),我需要用这个方法更新他的个人资料 Observable<Boolean> updateProfile(int id) ,没关系,工作正常。
我现在需要的是为多个 id 创建方法,如果所有配置文件都已更新,则返回 true。它可能有这个签名Observable<Boolean> updateAllProfiles(int[] ids)
如何实现这样的目标?
【问题讨论】:
标签:
java
android
rx-java
reactive-programming
rx-java2
【解决方案1】:
假设您要单独更新每个配置文件并在所有更新结束后返回 true,您可以使用 flatMap 和 reduce 的组合:
Observable<Boolean> updateAllProfiles(Integer[] ids) {
return Observable.from(ids)
.flatMap(id -> updateProfile(id))
.reduce((prevResult, currResult) -> prevResult && currResult);
}
及用途:
updateAllProfiles(new Integer[]{0, 1, 2, 3, 4})
.subscribe(updateAllSucceed -> { //do something with result});
这将并行触发所有更新(假设每个更新配置文件将作用于 Scheduler.io 或类似的创建新线程)并将累积所有结果指示并相应地返回真/假。
顺便说一句,您可能需要考虑Completable 而不是Observable<Boolean>,这非常适合“无效”更新方法(您可以阅读我的解释here)
【解决方案2】:
Observable<Boolean> updateAllProfiles(Integer[] ids) {
return Observable.from(ids)
.flatMap(id -> updateProfile(id))
.all(success-> success);
}