【发布时间】:2018-12-07 14:33:49
【问题描述】:
我有:Single<List<T>>
我想在整个列表上同时运行一种方法,在列表的每个元素上同时运行另一种方法。这两个方法返回void,所以最后我想要Completable,当所有方法调用(n+1)都成功时完成。所有 n+1 调用应同时运行。
我怎样才能做到这一点?
【问题讨论】:
我有:Single<List<T>>
我想在整个列表上同时运行一种方法,在列表的每个元素上同时运行另一种方法。这两个方法返回void,所以最后我想要Completable,当所有方法调用(n+1)都成功时完成。所有 n+1 调用应同时运行。
我怎样才能做到这一点?
【问题讨论】:
我认为你需要这样的东西
你有一个Single<List>(我用过Single<List<Integer>>)
说
Single<List<Integer>> listSingle = Single.fromCallable(() -> Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
1 : 使用Single<List<T>> 做某事的函数
public Completable doSomthingWithList(Single<List<Integer>> listSingle) {
return listSingle.flatMapCompletable(intList -> Completable.fromAction(() -> {
// do something with intList
System.out.println("doSomthingWithList");
})).subscribeOn(Schedulers.io()); // doing this in a background thread
}
2:另一个对列表中的所有项目执行某些操作的函数
public Completable doSomethingForEachItemInList(Single<List<Integer>> listSingle) {
return listSingle.flatMapObservable(Observable::fromIterable)
.flatMapCompletable(integer -> Completable.fromAction(() -> {
System.out.println("Doing somthing with list item " + integer);
})).subscribeOn(Schedulers.io());
}
3:并行执行以上2个函数,并在这两个函数都完成时通知
Completable.mergeArray(doSomthingWithList(listSingle), doSomethingForEachItemInList(listSingle))
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onComplete() {
// all actions completed
System.out.println("All done!");
}
@Override
public void onError(Throwable e) {
System.out.println(e.getMessage());
}
});
【讨论】: