2017-05-26 89 views
3

我有一個Observable<Single<T>>,我想將其轉換爲新的Observable<T>,其中任何Single<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

我想你應該能夠做到這一點簡單一點:

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

這的確是簡單。謝謝! – sdgfsdh

相關問題