RxJava2 - 最后成功的单身来自concat

时间:2018-01-29 19:13:36

标签: java observable reactive-programming rx-java2

我有N个单一来源,我想连续这些并获得最新成功的Single。例如:

DB Single:

- [A] - | - >

API Single:

--- --- X>

Single.concat(DB,API):

- [A] - | - >

否则:

DB Single:

- [A] - | - >

API Single:

- [B] - | - >

Single.concat(DB,API):

- [B] - | - >

这可能吗?我阅读了文档,但没有找到类似“lastSuccessfullOrError()”方法的内容。我试过“elementAt”,“lastOrError”和其他人,但他们的行为不是我正在寻找的

谢谢

1 个答案:

答案 0 :(得分:1)

这可以通过以下方式实现:

public static <T> Single<T> latestSuccess(Single<T>... sources) {
     return Single.defer(() -> {
         AtomicReference<T> last = new AtomicReference<T>();
         return Observable.fromArray(sources)
             .concatMap(source ->
                  source.doOnSuccess(last::lazySet)
                  .toObservable()
                  .onErrorResumeNext(Observable.empty())
             )
             .ignoreElements()
             .andThen(Single.fromCallable(() -> {
                 if (last.get() == null) {
                     throw new NoSuchElementException();
                 }
                 return last.get();
             }));
     });
}