我有: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:并行执行上述两个功能,并在这两个功能都完成时通知
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());
}
});