我有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);
答案 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())
);
}