転載、リンクなどのソースを明記してください:
:この記事はから来て103styleさんのブログ
変換関連の事業者との公式紹介
RxJava
concatMap
シリーズの変換演算子公式の説明:変革観測
concatMap
concatMapCompletable
concatMapCompletableDelayError
concatMapDelayError
concatMapEager
concatMapEagerDelayError
concatMapIterable
concatMapMaybe
concatMapMaybeDelayError
concatMapSingle
concatMapSingleDelayError
ここでは、単に特定の実装、中間流を参照してください解決ソース演算子を作成RxJava。
concatMap
- 公式例:
出力:Observable.range(0, 5) .concatMap(i -> { long delay = Math.round(Math.random() * 2); return Observable.timer(delay, TimeUnit.SECONDS).map(n -> i); }) .blockingSubscribe(System.out::print);
01234
- オブジェクトを返し
ObservableConcatMap
さんsubscribeActual
:メソッド
単一のパラメータconcatMap
のオペレータのデフォルトがdelayErrors
ありますErrorMode.IMMEDIATE
。public void subscribeActual(Observer<? super U> observer) { if (ObservableScalarXMap.tryScalarXMapSubscribe(source, observer, mapper)) { return; } if (delayErrors == ErrorMode.IMMEDIATE) { SerializedObserver<U> serial = new SerializedObserver<U>(observer); source.subscribe(new SourceObserver<T, U>(serial, mapper, bufferSize)); } else { source.subscribe(new ConcatMapDelayErrorObserver<T, U>(observer, mapper, bufferSize, delayErrors == ErrorMode.END)); } }
- 見て続行:
SourceObserver
onNext(T t)
public void onNext(T t) { if (done) { return; } if (fusionMode == QueueDisposable.NONE) { queue.offer(t); } drain(); } public void onComplete() { if (done) { return; } done = true; drain(); } void drain() { ... for (;;) { ... if (!active) { ... if (!empty) { ObservableSource<? extends U> o; try { //1.0 o = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper returned a null ObservableSource"); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); dispose(); queue.clear(); downstream.onError(ex); return; } active = true; o.subscribe(inner);//2.0 } } ... } }
-
(1.0)
ここでは、でご覧concatMap
入ってくるオペレータFunction
のapply
再構築ObservableSource
オブジェクトを。 -
(2.0)
そして、新しく作成されObservableSource
たオブジェクトsubscribe(observer)
。
-
concatMapXXX
concatMapCompletable
、concatMapCompletableDelayError
、concatMapDelayError
、concatMapEager
、concatMapEagerDelayError
、concatMapIterable
、concatMapMaybe
、concatMapMaybeDelayError
、concatMapSingle
、concatMapSingleDelayError
ロジックと実装concatMap
、我々はそれらを繰り返すことはしません、類似しました。
公式例:
-
concatMapCompletable
Observable<Integer> source = Observable.just(2, 1, 3); Completable completable = source.concatMapCompletable(x -> { return Completable.timer(x, TimeUnit.SECONDS) .doOnComplete(() -> System.out.println("Info: Processing of item \"" + x + "\" completed")); }); completable.doOnComplete(() -> System.out.println("Info: Processing of all items completed")) .blockingAwait();
出力:
Info: Processing of item "2" completed Info: Processing of item "1" completed Info: Processing of item "3" completed Info: Processing of all items completed
-
concatMapCompletableDelayError
Observable<Integer> source = Observable.just(2, 1, 3); Completable completable = source.concatMapCompletableDelayError(x -> { if (x.equals(2)) { return Completable.error(new IOException("Processing of item \"" + x + "\" failed!")); } else { return Completable.timer(1, TimeUnit.SECONDS) .doOnComplete(() -> System.out.println("Info: Processing of item \"" + x + "\" completed")); } }); completable.doOnError(error -> System.out.println("Error: " + error.getMessage())) .onErrorComplete() .blockingAwait();
出力:
Info: Processing of item "1" completed Info: Processing of item "3" completed Error: Processing of item "2" failed!
-
concatMapDelayError
Observable.intervalRange(1, 3, 0, 1, TimeUnit.SECONDS) .concatMapDelayError(x -> { if (x.equals(1L)) return Observable.error(new IOException("Something went wrong!")); else return Observable.just(x, x * x); }) .blockingSubscribe( x -> System.out.println("onNext: " + x), error -> System.out.println("onError: " + error.getMessage()));
出力:
onNext: 2 onNext: 4 onNext: 3 onNext: 9 onError: Something went wrong!
-
concatMapEager
Observable.range(0, 5) .concatMapEager(i -> { long delay = Math.round(Math.random() * 3); return Observable.timer(delay, TimeUnit.SECONDS) .map(n -> i) .doOnNext(x -> System.out.println("Info: Finished processing item " + x)); }) .blockingSubscribe(i -> System.out.println("onNext: " + i));
出力:
Info: Finished processing item 2 Info: Finished processing item 3 Info: Finished processing item 1 Info: Finished processing item 0 Info: Finished processing item 4 onNext: 0 onNext: 1 onNext: 2 onNext: 3 onNext: 4
-
concatMapEagerDelayError
Observable<Integer> source = Observable.create(emitter -> { emitter.onNext(1); emitter.onNext(2); emitter.onError(new Error("Fatal error!")); }); source.doOnError(error -> System.out.println("Info: Error from main source " + error.getMessage())) .concatMapEagerDelayError(x -> { return Observable.timer(1, TimeUnit.SECONDS).map(n -> x) .doOnSubscribe(it -> System.out.println("Info: Processing of item \"" + x + "\" started")); }, true) .blockingSubscribe( x -> System.out.println("onNext: " + x), error -> System.out.println("onError: " + error.getMessage()));
出力:
Info: Processing of item "1" started Info: Processing of item "2" started Info: Error from main source Fatal error! onNext: 1 onNext: 2 onError: Fatal error!
-
concatMapIterable
Observable.just("A", "B", "C") .concatMapIterable(item -> Arrays.asList(item, item, item)) .subscribe(System.out::print);
出力:
AAABBBCCC
-
concatMapMaybe
Observable.just("5", "3,14", "2.71", "FF") .concatMapMaybe(v -> { return Maybe.fromCallable(() -> Double.parseDouble(v)) .doOnError(e -> System.out.println("Info: The value \"" + v + "\" could not be parsed.")) // Ignore values that can not be parsed. .onErrorComplete(); }) .subscribe(x -> System.out.println("onNext: " + x));
出力:
onNext: 5.0 Info: The value "3,14" could not be parsed. onNext: 2.71 Info: The value "FF" could not be parsed.
-
concatMapMaybeDelayError
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.uuuu"); Observable.just("04.03.2018", "12-08-2018", "06.10.2018", "01.12.2018") .concatMapMaybeDelayError(date -> { return Maybe.fromCallable(() -> LocalDate.parse(date, dateFormatter)); }) .subscribe( localDate -> System.out.println("onNext: " + localDate), error -> System.out.println("onError: " + error.getMessage()));
出力:
onNext: 2018-03-04 onNext: 2018-10-06 onNext: 2018-12-01 onError: Text '12-08-2018' could not be parsed at index 2
-
concatMapSingle
Observable.just("5", "3,14", "2.71", "FF") .concatMapSingle(v -> { return Single.fromCallable(() -> Double.parseDouble(v)) .doOnError(e -> System.out.println("Info: The value \"" + v + "\" could not be parsed.")) // Return a default value if the given value can not be parsed. .onErrorReturnItem(42.0); }) .subscribe(x -> System.out.println("onNext: " + x));
出力:
onNext: 5.0 Info: The value "3,14" could not be parsed. onNext: 42.0 onNext: 2.71 Info: The value "FF" could not be parsed. onNext: 42.0
-
concatMapSingleDelayError
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.uuuu"); Observable.just("24.03.2018", "12-08-2018", "06.10.2018", "01.12.2018") .concatMapSingleDelayError(date -> { return Single.fromCallable(() -> LocalDate.parse(date, dateFormatter)); }) .subscribe( localDate -> System.out.println("onNext: " + localDate), error -> System.out.println("onError: " + error.getMessage()));
出力:
onNext: 2018-03-24 onNext: 2018-10-06 onNext: 2018-12-01 onError: Text '12-08-2018' could not be parsed at index 2
ます。https://www.jianshu.com/p/db409f7fdd47で再現