忽略Observable <single <t>&gt;中的错误

时间:2017-05-26 10:12:10

标签: java rx-java rx-java2

我有Observable<Single<T>>我希望将其转换为新的Observable<T>,其中任何失败的Single<T>都会被忽略。

以下是我对实施的尝试:

public static <T> Observable<T> skipErrors(final Observable<Single<T>> xs) {
    Preconditions.checkNotNull(xs);
    return xs.flatMap(single -> single.map(Optional::of)
        .onErrorReturn(error -> Optional.empty())
        .flatMapObservable(optional ->
            optional.map(Observable::just).orElseGet(Observable::empty)));
}

基本上,它会在Optional中包含所有成功,并将每次失败映射到Optional.empty()。然后在flatMapObservable中过滤选项。

有更惯用的方法吗?

单元测试:

final Observable<Single<String>> observable = skipErrors(Observable.just(
    Single.error(new Exception()),
    Single.error(new Exception()),
    Single.just("Hello"),
    Single.error(new Exception()),
    Single.just("world"),
    Single.error(new Exception())));

final ImmutableList<String> expected = ImmutableList.of("Hello", "world");
final ImmutableList<String> actual = observable.toList()
    .blockingGet()
    .stream()
    .collect(ImmutableList.toImmutableList());

assertEquals(expected, actual);

1 个答案:

答案 0 :(得分:1)

我认为你应该能够做得更简单一些:

public static <T> Observable<T> skipErrors(final Observable<Single<T>> singles) {
  Preconditions.checkNotNull(xs);
  return singles
    .flatMap(single -> single
        .toObservable()
        .onErrorResumeNext(Observable.empty())
    );
}