我有:
Single<List<T>>
我想在整个列表上同时运行一个方法,在列表的每个元素上同时运行其他方法。这两个方法都返回void,所以最后我想拥有Completable,当所有方法调用(n + 1)成功完成时,它将完成。所有n + 1个调用应同时运行。
我该如何实现?
答案 0 :(得分:2)
我认为您需要这样的东西
您有一个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:并行执行上述两个功能,并在两个功能完成时通知
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());
}
});