From 4c1898f0d2cb4f3d2a22ae709e0666c91fdd9e04 Mon Sep 17 00:00:00 2001 From: akarnokd Date: Thu, 30 Jan 2020 14:37:01 +0100 Subject: [PATCH 1/2] 3.x: Add concatEagerDelayError across --- docs/Operator-Matrix.md | 258 +++++++++--------- .../reactivex/rxjava3/core/Completable.java | 1 + .../io/reactivex/rxjava3/core/Flowable.java | 171 +++++++++++- .../java/io/reactivex/rxjava3/core/Maybe.java | 205 +++++++++++++- .../io/reactivex/rxjava3/core/Observable.java | 156 +++++++++-- .../io/reactivex/rxjava3/core/Single.java | 251 +++++++++++++++-- .../flowable/FlowableConcatMapEagerTest.java | 46 +++- .../operators/maybe/MaybeConcatEagerTest.java | 152 +++++++++++ .../ObservableConcatMapEagerTest.java | 44 +++ .../single/SingleConcatEagerTest.java | 141 ++++++++++ .../internal/util/MarbleDimensions.java | 2 +- .../validators/ParamValidationNaming.java | 1 + 12 files changed, 1236 insertions(+), 192 deletions(-) create mode 100644 src/test/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeConcatEagerTest.java create mode 100644 src/test/java/io/reactivex/rxjava3/internal/operators/single/SingleConcatEagerTest.java diff --git a/docs/Operator-Matrix.md b/docs/Operator-Matrix.md index dfa16162e7..afeb8e4182 100644 --- a/docs/Operator-Matrix.md +++ b/docs/Operator-Matrix.md @@ -37,69 +37,69 @@ Operator | ![Flowable](https://raw.github.com/wiki/ReactiveX/RxJava/images/opmat `concatArrayEagerDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([25](#notes-25))| `concatDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `concatEager`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([26](#notes-26))| -`concatMap`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapCompletable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapCompletableDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([29](#notes-29))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([29](#notes-29))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapEager`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([30](#notes-30))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([30](#notes-30))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapEagerDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([30](#notes-30))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([30](#notes-30))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapIterable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([31](#notes-31))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([31](#notes-31))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapMaybe`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([32](#notes-32))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapMaybeDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([33](#notes-33))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([33](#notes-33))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapSingle`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([34](#notes-34))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapSingleDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([35](#notes-35))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([35](#notes-35))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`concatMapStream`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([36](#notes-36))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([36](#notes-36))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| +`concatEagerDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| +`concatMap`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapCompletable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapCompletableDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([29](#notes-29))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([29](#notes-29))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([30](#notes-30))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([30](#notes-30))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapEager`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([31](#notes-31))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([31](#notes-31))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapEagerDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([31](#notes-31))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([31](#notes-31))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapIterable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([32](#notes-32))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([32](#notes-32))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapMaybe`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([33](#notes-33))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapMaybeDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([34](#notes-34))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([34](#notes-34))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapSingle`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([35](#notes-35))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapSingleDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([36](#notes-36))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([36](#notes-36))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`concatMapStream`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([37](#notes-37))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([37](#notes-37))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| `concatWith`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `contains`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| -`count`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([37](#notes-37))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([38](#notes-38))| +`count`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([38](#notes-38))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))| `create`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`debounce`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`defaultIfEmpty`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([23](#notes-23))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`debounce`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`defaultIfEmpty`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([23](#notes-23))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([42](#notes-42))| `defer`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `delay`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `delaySubscription`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`dematerialize`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`distinct`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([42](#notes-42))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([42](#notes-42))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`distinctUntilChanged`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([42](#notes-42))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([42](#notes-42))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`doAfterNext`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([43](#notes-43))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([43](#notes-43))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| -`doAfterSuccess`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([44](#notes-44))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([44](#notes-44))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| +`dematerialize`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`distinct`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([43](#notes-43))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([43](#notes-43))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`distinctUntilChanged`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([43](#notes-43))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([43](#notes-43))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`doAfterNext`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([44](#notes-44))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([44](#notes-44))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| +`doAfterSuccess`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([45](#notes-45))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([45](#notes-45))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| `doAfterTerminate`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `doFinally`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`doOnCancel`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([45](#notes-45))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([45](#notes-45))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([45](#notes-45))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([45](#notes-45))| -`doOnComplete`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([46](#notes-46))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`doOnDispose`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([47](#notes-47))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`doOnEach`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([48](#notes-48))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([48](#notes-48))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| +`doOnCancel`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([46](#notes-46))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([46](#notes-46))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([46](#notes-46))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([46](#notes-46))| +`doOnComplete`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([47](#notes-47))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| +`doOnDispose`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([48](#notes-48))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| +`doOnEach`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([49](#notes-49))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([49](#notes-49))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| `doOnError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`doOnEvent`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([49](#notes-49))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([49](#notes-49))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| +`doOnEvent`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([50](#notes-50))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([50](#notes-50))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `doOnLifecycle`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`doOnNext`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([50](#notes-50))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([50](#notes-50))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`doOnRequest`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))| +`doOnNext`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`doOnRequest`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))| `doOnSubscribe`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`doOnSuccess`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| +`doOnSuccess`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([53](#notes-53))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([53](#notes-53))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| `doOnTerminate`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`elementAt`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([53](#notes-53))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([54](#notes-54))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`elementAtOrError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([55](#notes-55))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([54](#notes-54))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`empty`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([23](#notes-23))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([56](#notes-56))| +`elementAt`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([54](#notes-54))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([55](#notes-55))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`elementAtOrError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([56](#notes-56))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([55](#notes-55))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`empty`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([23](#notes-23))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([57](#notes-57))| `error`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`filter`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`first`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([57](#notes-57))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([58](#notes-58))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| -`firstElement`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| -`firstOrError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([61](#notes-61))| -`firstOrErrorStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))| -`firstStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))| -`flatMap`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flatMapCompletable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flatMapIterable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([31](#notes-31))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([31](#notes-31))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flatMapMaybe`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([64](#notes-64))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flatMapObservable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([65](#notes-65))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([66](#notes-66))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flatMapPublisher`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([66](#notes-66))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([67](#notes-67))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flatMapSingle`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([64](#notes-64))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flatMapSingleElement`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([68](#notes-68))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([68](#notes-68))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([66](#notes-66))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flatMapStream`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([36](#notes-36))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([36](#notes-36))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flattenAsFlowable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([69](#notes-69))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([69](#notes-69))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flattenAsObservable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([69](#notes-69))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([69](#notes-69))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flattenStreamAsFlowable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([70](#notes-70))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([70](#notes-70))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`flattenStreamAsObservable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([70](#notes-70))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([70](#notes-70))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| +`filter`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`first`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([58](#notes-58))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([42](#notes-42))| +`firstElement`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([61](#notes-61))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| +`firstOrError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([61](#notes-61))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))| +`firstOrErrorStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([64](#notes-64))| +`firstStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))| +`flatMap`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flatMapCompletable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flatMapIterable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([32](#notes-32))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([32](#notes-32))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flatMapMaybe`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([65](#notes-65))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flatMapObservable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([66](#notes-66))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([67](#notes-67))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flatMapPublisher`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([67](#notes-67))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([68](#notes-68))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flatMapSingle`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([65](#notes-65))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flatMapStream`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([37](#notes-37))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([37](#notes-37))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flattenAsFlowable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([69](#notes-69))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([69](#notes-69))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flattenAsObservable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([69](#notes-69))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([69](#notes-69))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flattenStreamAsFlowable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([70](#notes-70))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([70](#notes-70))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`flattenStreamAsObservable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([70](#notes-70))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([70](#notes-70))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| `forEach`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([71](#notes-71))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([71](#notes-71))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([71](#notes-71))| `forEachWhile`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([71](#notes-71))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([71](#notes-71))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([71](#notes-71))| `fromAction`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([23](#notes-23))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| @@ -125,17 +125,17 @@ Operator | ![Flowable](https://raw.github.com/wiki/ReactiveX/RxJava/images/opmat `ignoreElements`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([82](#notes-82))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([82](#notes-82))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| `interval`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([83](#notes-83))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([83](#notes-83))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([83](#notes-83))| `intervalRange`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([83](#notes-83))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([83](#notes-83))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([83](#notes-83))| -`isEmpty`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([58](#notes-58))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| +`isEmpty`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| `join`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([84](#notes-84))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([84](#notes-84))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([80](#notes-80))| `just`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| -`last`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([57](#notes-57))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([58](#notes-58))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| -`lastElement`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| -`lastOrError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([61](#notes-61))| -`lastOrErrorStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))| -`lastStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))| +`last`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([58](#notes-58))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([42](#notes-42))| +`lastElement`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([61](#notes-61))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| +`lastOrError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([61](#notes-61))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))| +`lastOrErrorStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([64](#notes-64))| +`lastStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))| `lift`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`map`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`mapOptional`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| +`map`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`mapOptional`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| `materialize`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `merge`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `mergeArray`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| @@ -145,9 +145,9 @@ Operator | ![Flowable](https://raw.github.com/wiki/ReactiveX/RxJava/images/opmat `never`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `observeOn`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `ofType`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([85](#notes-85))| -`onBackpressureBuffer`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))| -`onBackpressureDrop`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))| -`onBackpressureLatest`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))| +`onBackpressureBuffer`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))| +`onBackpressureDrop`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))| +`onBackpressureLatest`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))| `onErrorComplete`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `onErrorResumeNext`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `onErrorResumeWith`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| @@ -158,7 +158,7 @@ Operator | ![Flowable](https://raw.github.com/wiki/ReactiveX/RxJava/images/opmat `publish`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([87](#notes-87))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([88](#notes-88))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([89](#notes-89))| `range`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([90](#notes-90))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([90](#notes-90))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([74](#notes-74))| `rangeLong`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([90](#notes-90))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([90](#notes-90))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([74](#notes-74))| -`rebatchRequests`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([51](#notes-51))| +`rebatchRequests`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([52](#notes-52))| `reduce`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([91](#notes-91))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([91](#notes-91))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([92](#notes-92))| `reduceWith`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([91](#notes-91))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([91](#notes-91))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([92](#notes-92))| `repeat`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| @@ -169,19 +169,19 @@ Operator | ![Flowable](https://raw.github.com/wiki/ReactiveX/RxJava/images/opmat `retryUntil`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `retryWhen`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `safeSubscribe`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`sample`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| +`sample`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| `scan`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([91](#notes-91))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([91](#notes-91))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([92](#notes-92))| `scanWith`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([91](#notes-91))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([91](#notes-91))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([92](#notes-92))| `sequenceEqual`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `serialize`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([93](#notes-93))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([93](#notes-93))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([93](#notes-93))| `share`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([87](#notes-87))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([88](#notes-88))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([89](#notes-89))| -`single`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([57](#notes-57))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([58](#notes-58))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| -`singleElement`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| -`singleOrError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([61](#notes-61))| -`singleOrErrorStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))| -`singleStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))| -`skip`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))| -`skipLast`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))| +`single`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([58](#notes-58))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([42](#notes-42))| +`singleElement`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([61](#notes-61))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| +`singleOrError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([61](#notes-61))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([62](#notes-62))| +`singleOrErrorStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([64](#notes-64))| +`singleStage`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([63](#notes-63))| +`skip`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))| +`skipLast`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))| `skipUntil`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([94](#notes-94))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([94](#notes-94))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([94](#notes-94))| `skipWhile`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([95](#notes-95))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([95](#notes-95))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| `sorted`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([78](#notes-78))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([78](#notes-78))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([78](#notes-78))| @@ -193,29 +193,29 @@ Operator | ![Flowable](https://raw.github.com/wiki/ReactiveX/RxJava/images/opmat `subscribeOn`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `subscribeWith`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `switchIfEmpty`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([23](#notes-23))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([99](#notes-99))| -`switchMap`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`switchMapCompletable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`switchMapCompletableDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`switchMapDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`switchMapMaybe`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`switchMapMaybeDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`switchMapSingle`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| -`switchMapSingleDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([27](#notes-27))| +`switchMap`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`switchMapCompletable`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`switchMapCompletableDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`switchMapDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`switchMapMaybe`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`switchMapMaybeDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`switchMapSingle`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| +`switchMapSingleDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([100](#notes-100))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([28](#notes-28))| `switchOnNext`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `switchOnNextDelayError`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`take`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))| -`takeLast`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([59](#notes-59))| +`take`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))| +`takeLast`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([60](#notes-60))| `takeUntil`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `takeWhile`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([95](#notes-95))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([95](#notes-95))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([2](#notes-2))| `test`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`throttleFirst`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`throttleLast`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`throttleLatest`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`throttleWithTimeout`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([39](#notes-39))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| -`timeInterval`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| +`throttleFirst`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`throttleLast`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`throttleLatest`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`throttleWithTimeout`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| +`timeInterval`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| `timeout`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `timer`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| -`timestamp`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([40](#notes-40))| +`timestamp`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([41](#notes-41))| `to`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `toCompletionStage`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([101](#notes-101))|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([101](#notes-101))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| `toFlowable`|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([102](#notes-102))|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)| @@ -237,7 +237,7 @@ Operator | ![Flowable](https://raw.github.com/wiki/ReactiveX/RxJava/images/opmat `zip`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([111](#notes-111))| `zipArray`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([112](#notes-112))| `zipWith`|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![present](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_on.png)|![absent](https://raw.github.com/wiki/ReactiveX/RxJava/images/checkmark_off.png) ([113](#notes-113))| -**237 operators** | **215** | **209** | **118** | **107** | **84** | +**237 operators** | **216** | **210** | **118** | **108** | **84** | #### Notes 1 Use [`contains()`](#contains).
@@ -266,48 +266,48 @@ Operator | ![Flowable](https://raw.github.com/wiki/ReactiveX/RxJava/images/opmat 24 No items to keep ordered. Use [`mergeArray()`](#mergeArray).
25 No items to keep ordered. Use [`mergeArrayDelayError()`](#mergeArrayDelayError).
26 No items to keep ordered. Use [`merge()`](#merge).
-27 Always empty thus no items to map.
-28 Either the upstream fails (thus no inner) or the mapped-in source, but never both. Use [`concatMapCompletable`](#concatMapCompletable).
-29 Either the upstream fails (thus no inner) or the mapped-in source, but never both. Use [`concatMap`](#concatMap).
-30 At most one item to map. Use [`concatMap()`](#concatMap).
-31 At most one item. Use [`flattenAsFlowable`](#flattenAsFlowable) or [`flattenAsObservable`](#flattenAsObservable).
-32 Use [`concatMap`](#concatMap).
-33 Either the upstream fails (thus no inner) or the mapped-in source, but never both. Use [`concatMapMaybe`](#concatMapMaybe).
-34 Use [`concatMap()`](#concatMap).
-35 Either the upstream fails (thus no inner) or the mapped-in source, but never both. Use [`concatMapSingle`](#concatMapSingle).
-36 At most one item. Use [`flattenStreamAsFlowable`](#flattenStreamAsFlowable) or [`flattenStreamAsObservable`](#flattenStreamAsObservable).
-37 Never empty thus always 1.
-38 Always empty thus always 0.
-39 At most one item signaled so no subsequent items to work with.
-40 Always empty thus no items to work with.
-41 Always empty. Use [`andThen()`](#andThen) to chose the follow-up sequence.
-42 At most one item, always distinct.
-43 Different terminology. Use [`doAfterSuccess()`](#doAfterSuccess).
-44 Different terminology. Use [`doAfterNext()`](#doAfterNext).
-45 Different terminology. Use [`doOnDispose()`](#doOnDispose).
-46 Always succeeds or fails, there is no `onComplete` signal.
-47 Different terminology. Use [`doOnCancel()`](#doOnCancel).
-48 At most one item. Use [`doOnEvent()`](#doOnEvent).
-49 Use [`doOnEach()`](#doOnEach).
-50 Different terminology. Use [`doOnSuccess()`](#doOnSuccess).
-51 Backpressure related and not supported outside `Flowable`.
-52 Different terminology. Use [`doOnNext()`](#doOnNext).
-53 At most one item with index 0. Use [`defaultIfEmpty`](#defaultIfEmpty).
-54 Always one item with index 0.
-55 At most one item with index 0. Use [`toSingle`](#toSingle).
-56 Use [`complete()`](#complete).
-57 At most one item. Use [`defaultIfEmpty`](#defaultIfEmpty).
-58 Always one item.
-59 At most one item, would be no-op.
-60 Always one item, would be no-op.
-61 Always empty. Use [`andThen()`](#andThen) and [`error()`](#error).
-62 At most one item. Use [`toCompletionStage()`](#toCompletionStage).
-63 Always empty. Use [`andThen()`](#andThen), [`error()`](#error) and [`toCompletionStage()`](#toCompletionStage).
-64 Use [`flatMap()`](#flatMap).
-65 Not supported. Use [`flatMap`](#flatMap) and [`toFlowable()`](#toFlowable).
-66 Use [`flatMap`](#flatMap).
-67 Not supported. Use [`flatMap`](#flatMap) and [`toObservable()`](#toFlowable).
-68 Use [`flatMapSingle`](#flatMapSingle).
+27 No items to keep ordered. Use [`mergeDelayError()`](#mergeDelayError).
+28 Always empty thus no items to map.
+29 Either the upstream fails (thus no inner) or the mapped-in source, but never both. Use [`concatMapCompletable`](#concatMapCompletable).
+30 Either the upstream fails (thus no inner) or the mapped-in source, but never both. Use [`concatMap`](#concatMap).
+31 At most one item to map. Use [`concatMap()`](#concatMap).
+32 At most one item. Use [`flattenAsFlowable`](#flattenAsFlowable) or [`flattenAsObservable`](#flattenAsObservable).
+33 Use [`concatMap`](#concatMap).
+34 Either the upstream fails (thus no inner) or the mapped-in source, but never both. Use [`concatMapMaybe`](#concatMapMaybe).
+35 Use [`concatMap()`](#concatMap).
+36 Either the upstream fails (thus no inner) or the mapped-in source, but never both. Use [`concatMapSingle`](#concatMapSingle).
+37 At most one item. Use [`flattenStreamAsFlowable`](#flattenStreamAsFlowable) or [`flattenStreamAsObservable`](#flattenStreamAsObservable).
+38 Never empty thus always 1.
+39 Always empty thus always 0.
+40 At most one item signaled so no subsequent items to work with.
+41 Always empty thus no items to work with.
+42 Always empty. Use [`andThen()`](#andThen) to chose the follow-up sequence.
+43 At most one item, always distinct.
+44 Different terminology. Use [`doAfterSuccess()`](#doAfterSuccess).
+45 Different terminology. Use [`doAfterNext()`](#doAfterNext).
+46 Different terminology. Use [`doOnDispose()`](#doOnDispose).
+47 Always succeeds or fails, there is no `onComplete` signal.
+48 Different terminology. Use [`doOnCancel()`](#doOnCancel).
+49 At most one item. Use [`doOnEvent()`](#doOnEvent).
+50 Use [`doOnEach()`](#doOnEach).
+51 Different terminology. Use [`doOnSuccess()`](#doOnSuccess).
+52 Backpressure related and not supported outside `Flowable`.
+53 Different terminology. Use [`doOnNext()`](#doOnNext).
+54 At most one item with index 0. Use [`defaultIfEmpty`](#defaultIfEmpty).
+55 Always one item with index 0.
+56 At most one item with index 0. Use [`toSingle`](#toSingle).
+57 Use [`complete()`](#complete).
+58 At most one item. Use [`defaultIfEmpty`](#defaultIfEmpty).
+59 Always one item.
+60 At most one item, would be no-op.
+61 Always one item, would be no-op.
+62 Always empty. Use [`andThen()`](#andThen) and [`error()`](#error).
+63 At most one item. Use [`toCompletionStage()`](#toCompletionStage).
+64 Always empty. Use [`andThen()`](#andThen), [`error()`](#error) and [`toCompletionStage()`](#toCompletionStage).
+65 Use [`flatMap()`](#flatMap).
+66 Not supported. Use [`flatMap`](#flatMap) and [`toFlowable()`](#toFlowable).
+67 Use [`flatMap`](#flatMap).
+68 Not supported. Use [`flatMap`](#flatMap) and [`toObservable()`](#toFlowable).
69 Use [`flatMapIterable()`](#flatMapIterable).
70 Use [`flatMapStream()`](#flatMapStream).
71 Use [`subscribe()`](#subscribe).
diff --git a/src/main/java/io/reactivex/rxjava3/core/Completable.java b/src/main/java/io/reactivex/rxjava3/core/Completable.java index cfdd87067d..682a493849 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Completable.java +++ b/src/main/java/io/reactivex/rxjava3/core/Completable.java @@ -1050,6 +1050,7 @@ public static Completable mergeDelayError(@NonNull Publisher<@NonNull ? extends * at a time to the inner {@code CompletableSource}s * @return the new {@code Completable} instance * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive */ @CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) diff --git a/src/main/java/io/reactivex/rxjava3/core/Flowable.java b/src/main/java/io/reactivex/rxjava3/core/Flowable.java index 58ffd3d6f8..ddf5b3cf7b 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Flowable.java +++ b/src/main/java/io/reactivex/rxjava3/core/Flowable.java @@ -1648,9 +1648,80 @@ public static Flowable concatDelayError(@NonNull Publisher<@NonNull ? ext return fromPublisher(sources).concatMapDelayError((Function)Functions.identity(), tillTheEnd, prefetch); } + /** + * Concatenates a sequence of {@link Publisher}s eagerly into a single stream of values. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * source {@code Publisher}s. The operator buffers the values emitted by these {@code Publisher}s and then drains them + * in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and the inner {@code Publisher}s are + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code Publisher}s that need to be eagerly concatenated + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @since 2.0 + */ + @CheckReturnValue + @BackpressureSupport(BackpressureKind.FULL) + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Flowable concatEager(@NonNull Iterable<@NonNull ? extends Publisher<@NonNull ? extends T>> sources) { + return concatEager(sources, bufferSize(), bufferSize()); + } + + /** + * Concatenates a sequence of {@link Publisher}s eagerly into a single stream of values and + * runs a limited number of inner sequences at once. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * source {@code Publisher}s. The operator buffers the values emitted by these {@code Publisher}s and then drains them + * in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and both the outer and inner {@code Publisher}s are + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code Publisher}s that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code Publisher}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code Publisher}s can be active at the same time + * @param prefetch the number of elements to prefetch from each inner {@code Publisher} source + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} or {@code prefetch} is non-positive + * @since 2.0 + */ + @CheckReturnValue + @NonNull + @BackpressureSupport(BackpressureKind.FULL) + @SchedulerSupport(SchedulerSupport.NONE) + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static Flowable concatEager(@NonNull Iterable<@NonNull ? extends Publisher<@NonNull ? extends T>> sources, int maxConcurrency, int prefetch) { + Objects.requireNonNull(sources, "sources is null"); + ObjectHelper.verifyPositive(maxConcurrency, "maxConcurrency"); + ObjectHelper.verifyPositive(prefetch, "prefetch"); + return RxJavaPlugins.onAssembly(new FlowableConcatMapEager(new FlowableFromIterable(sources), Functions.identity(), maxConcurrency, prefetch, ErrorMode.BOUNDARY)); + } + /** * Concatenates a {@link Publisher} sequence of {@code Publisher}s eagerly into a single stream of values. *

+ * + *

* Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the * emitted source {@code Publisher}s as they are observed. The operator buffers the values emitted by these * {@code Publisher}s and then drains them in order, each one after the previous one completes. @@ -1677,7 +1748,10 @@ public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends } /** - * Concatenates a {@link Publisher} sequence of {@code Publisher}s eagerly into a single stream of values. + * Concatenates a {@link Publisher} sequence of {@code Publisher}s eagerly into a single stream of values and + * runs a limited number of inner sequences at once. + *

+ * *

* Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the * emitted source {@code Publisher}s as they are observed. The operator buffers the values emitted by these @@ -1713,7 +1787,10 @@ public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends } /** - * Concatenates a sequence of {@link Publisher}s eagerly into a single stream of values. + * Concatenates a sequence of {@link Publisher}s eagerly into a single stream of values, + * delaying errors until all the inner sequences terminate. + *

+ * *

* Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the * source {@code Publisher}s. The operator buffers the values emitted by these {@code Publisher}s and then drains them @@ -1730,18 +1807,22 @@ public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends * @param sources a sequence of {@code Publisher}s that need to be eagerly concatenated * @return the new {@code Flowable} instance with the specified concatenation behavior * @throws NullPointerException if {@code sources} is {@code null} - * @since 2.0 + * @since 3.0.0 */ @CheckReturnValue @BackpressureSupport(BackpressureKind.FULL) @SchedulerSupport(SchedulerSupport.NONE) @NonNull - public static Flowable concatEager(@NonNull Iterable<@NonNull ? extends Publisher<@NonNull ? extends T>> sources) { - return concatEager(sources, bufferSize(), bufferSize()); + public static Flowable concatEagerDelayError(@NonNull Iterable<@NonNull ? extends Publisher<@NonNull ? extends T>> sources) { + return concatEagerDelayError(sources, bufferSize(), bufferSize()); } /** - * Concatenates a sequence of {@link Publisher}s eagerly into a single stream of values. + * Concatenates a sequence of {@link Publisher}s eagerly into a single stream of values, + * delaying errors until all the inner sequences terminate and runs a limited number + * of inner sequences at once. + *

+ * *

* Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the * source {@code Publisher}s. The operator buffers the values emitted by these {@code Publisher}s and then drains them @@ -1762,18 +1843,89 @@ public static Flowable concatEager(@NonNull Iterable<@NonNull ? extends P * @return the new {@code Flowable} instance with the specified concatenation behavior * @throws NullPointerException if {@code sources} is {@code null} * @throws IllegalArgumentException if {@code maxConcurrency} or {@code prefetch} is non-positive - * @since 2.0 + * @since 3.0.0 */ @CheckReturnValue @NonNull @BackpressureSupport(BackpressureKind.FULL) @SchedulerSupport(SchedulerSupport.NONE) @SuppressWarnings({ "rawtypes", "unchecked" }) - public static Flowable concatEager(@NonNull Iterable<@NonNull ? extends Publisher<@NonNull ? extends T>> sources, int maxConcurrency, int prefetch) { + public static Flowable concatEagerDelayError(@NonNull Iterable<@NonNull ? extends Publisher<@NonNull ? extends T>> sources, int maxConcurrency, int prefetch) { Objects.requireNonNull(sources, "sources is null"); ObjectHelper.verifyPositive(maxConcurrency, "maxConcurrency"); ObjectHelper.verifyPositive(prefetch, "prefetch"); - return RxJavaPlugins.onAssembly(new FlowableConcatMapEager(new FlowableFromIterable(sources), Functions.identity(), maxConcurrency, prefetch, ErrorMode.IMMEDIATE)); + return RxJavaPlugins.onAssembly(new FlowableConcatMapEager(new FlowableFromIterable(sources), Functions.identity(), maxConcurrency, prefetch, ErrorMode.END)); + } + + /** + * Concatenates a {@link Publisher} sequence of {@code Publisher}s eagerly into a single stream of values, + * delaying errors until all the inner and the outer sequences terminate. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code Publisher}s as they are observed. The operator buffers the values emitted by these + * {@code Publisher}s and then drains them in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and both the outer and inner {@code Publisher}s are + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code Publisher}s that need to be eagerly concatenated + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @since 3.0.0 + */ + @CheckReturnValue + @BackpressureSupport(BackpressureKind.FULL) + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Flowable concatEagerDelayError(@NonNull Publisher<@NonNull ? extends Publisher<@NonNull ? extends T>> sources) { + return concatEagerDelayError(sources, bufferSize(), bufferSize()); + } + + /** + * Concatenates a {@link Publisher} sequence of {@code Publisher}s eagerly into a single stream of values, + * delaying errors until all the inner and outer sequences terminate and runs a limited number of inner + * sequences at once. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code Publisher}s as they are observed. The operator buffers the values emitted by these + * {@code Publisher}s and then drains them in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and both the outer and inner {@code Publisher}s are + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code Publisher}s that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code Publisher}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code Publisher}s can be active at the same time + * @param prefetch the number of elements to prefetch from each inner {@code Publisher} source + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} or {@code prefetch} is non-positive + * @since 3.0.0 + */ + @CheckReturnValue + @NonNull + @BackpressureSupport(BackpressureKind.FULL) + @SchedulerSupport(SchedulerSupport.NONE) + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static Flowable concatEagerDelayError(@NonNull Publisher<@NonNull ? extends Publisher<@NonNull ? extends T>> sources, int maxConcurrency, int prefetch) { + Objects.requireNonNull(sources, "sources is null"); + ObjectHelper.verifyPositive(maxConcurrency, "maxConcurrency"); + ObjectHelper.verifyPositive(prefetch, "prefetch"); + return RxJavaPlugins.onAssembly(new FlowableConcatMapEagerPublisher(sources, Functions.identity(), maxConcurrency, prefetch, ErrorMode.END)); } /** @@ -10134,6 +10286,7 @@ public final Flowable flatMap(@NonNull FunctionReactiveX operators documentation: FlatMap * @since 2.0 */ diff --git a/src/main/java/io/reactivex/rxjava3/core/Maybe.java b/src/main/java/io/reactivex/rxjava3/core/Maybe.java index 66d5ad143d..a00e2c7366 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Maybe.java +++ b/src/main/java/io/reactivex/rxjava3/core/Maybe.java @@ -561,11 +561,11 @@ public static Flowable concatDelayError(@NonNull Publisher<@NonNull ? ext /** * Concatenates a sequence of {@link MaybeSource}s eagerly into a {@link Flowable} sequence. *

+ * + *

* Eager concatenation means that once an observer subscribes, this operator subscribes to all of the * source {@code MaybeSource}s. The operator buffers the values emitted by these {@code MaybeSource}s and then drains them * in order, each one after the previous one completes. - *

- * *

*
Backpressure:
*
Backpressure is honored towards the downstream.
@@ -583,7 +583,40 @@ public static Flowable concatDelayError(@NonNull Publisher<@NonNull ? ext @SchedulerSupport(SchedulerSupport.NONE) @NonNull public static Flowable concatEager(@NonNull Iterable<@NonNull ? extends MaybeSource> sources) { - return Flowable.fromIterable(sources).concatMapEager((Function)MaybeToPublisher.instance()); + return Flowable.fromIterable(sources).concatMapEagerDelayError((Function)MaybeToPublisher.instance(), false); + } + + /** + * Concatenates a sequence of {@link MaybeSource}s eagerly into a {@link Flowable} sequence and + * runs a limited number of the inner sequences at once. + *

+ * + *

+ * Eager concatenation means that once an observer subscribes, this operator subscribes to all of the + * source {@code MaybeSource}s. The operator buffers the values emitted by these {@code MaybeSource}s and then drains them + * in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code MaybeSource} that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code MaybeSource}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code MaybeSource}s can be active at the same time + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + * @since 3.0.0 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Flowable concatEager(@NonNull Iterable<@NonNull ? extends MaybeSource> sources, int maxConcurrency) { + return Flowable.fromIterable(sources).concatMapEagerDelayError((Function)MaybeToPublisher.instance(), false, maxConcurrency, 1); } /** @@ -616,6 +649,172 @@ public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends return Flowable.fromPublisher(sources).concatMapEager((Function)MaybeToPublisher.instance()); } + /** + * Concatenates a {@link Publisher} sequence of {@link MaybeSource}s eagerly into a {@link Flowable} sequence, + * running at most the given number of inner {@code MaybeSource}s at once. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code MaybeSource}s as they are observed. The operator buffers the values emitted by these + * {@code MaybeSource}s and then drains them in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and the outer {@code Publisher} is + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link io.reactivex.rxjava3.exceptions.MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code MaybeSource}s that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code MaybeSource}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code MaybeSource}s can be active at the same time + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends MaybeSource> sources, int maxConcurrency) { + return Flowable.fromPublisher(sources).concatMapEager((Function)MaybeToPublisher.instance(), maxConcurrency, 1); + } + + /** + * Concatenates a sequence of {@link MaybeSource}s eagerly into a {@link Flowable} sequence, + * delaying errors until all inner {@code MaybeSource}s terminate. + *

+ * + *

+ * Eager concatenation means that once an observer subscribes, this operator subscribes to all of the + * source {@code MaybeSource}s. The operator buffers the values emitted by these {@code MaybeSource}s and then drains them + * in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code MaybeSource} that need to be eagerly concatenated + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @since 3.0.0 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Flowable concatEagerDelayError(@NonNull Iterable<@NonNull ? extends MaybeSource> sources) { + return Flowable.fromIterable(sources).concatMapEagerDelayError((Function)MaybeToPublisher.instance(), true); + } + + /** + * Concatenates a sequence of {@link MaybeSource}s eagerly into a {@link Flowable} sequence, + * delaying errors until all inner {@code MaybeSource}s terminate and + * runs a limited number of inner {@code MaybeSource}s at once. + *

+ * + *

+ * Eager concatenation means that once an observer subscribes, this operator subscribes to all of the + * source {@code MaybeSource}s. The operator buffers the values emitted by these {@code MaybeSource}s and then drains them + * in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code MaybeSource} that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code MaybeSource}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code MaybeSource}s can be active at the same time + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + * @since 3.0.0 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Flowable concatEagerDelayError(@NonNull Iterable<@NonNull ? extends MaybeSource> sources, int maxConcurrency) { + return Flowable.fromIterable(sources).concatMapEagerDelayError((Function)MaybeToPublisher.instance(), true, maxConcurrency, 1); + } + + /** + * Concatenates a {@link Publisher} sequence of {@link MaybeSource}s eagerly into a {@link Flowable} sequence, + * delaying errors until all the inner and the outer sequence terminate. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code MaybeSource}s as they are observed. The operator buffers the values emitted by these + * {@code MaybeSource}s and then drains them in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and the outer {@code Publisher} is + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link io.reactivex.rxjava3.exceptions.MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code MaybeSource}s that need to be eagerly concatenated + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @since 3.0.0 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Flowable concatEagerDelayError(@NonNull Publisher<@NonNull ? extends MaybeSource> sources) { + return Flowable.fromPublisher(sources).concatMapEagerDelayError((Function)MaybeToPublisher.instance(), true); + } + + /** + * Concatenates a {@link Publisher} sequence of {@link MaybeSource}s eagerly into a {@link Flowable} sequence, + * delaying errors until all the inner and the outer sequence terminate and + * runs a limited number of the inner {@code MaybeSource}s at once. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code MaybeSource}s as they are observed. The operator buffers the values emitted by these + * {@code MaybeSource}s and then drains them in order, each one after the previous one completes. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and the outer {@code Publisher} is + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link io.reactivex.rxjava3.exceptions.MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code MaybeSource}s that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code MaybeSource}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code MaybeSource}s can be active at the same time + * @return the new {@code Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + * @since 3.0.0 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Flowable concatEagerDelayError(@NonNull Publisher<@NonNull ? extends MaybeSource> sources, int maxConcurrency) { + return Flowable.fromPublisher(sources).concatMapEagerDelayError((Function)MaybeToPublisher.instance(), true, maxConcurrency, 1); + } + /** * Provides an API (via a cold {@code Maybe}) that bridges the reactive world with the callback-style world. *

diff --git a/src/main/java/io/reactivex/rxjava3/core/Observable.java b/src/main/java/io/reactivex/rxjava3/core/Observable.java index 9eeb169871..033d12bdff 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Observable.java +++ b/src/main/java/io/reactivex/rxjava3/core/Observable.java @@ -1460,14 +1460,70 @@ public static Observable concatDelayError(@NonNull ObservableSource + * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * {@code ObservableSource}s. The operator buffers the values emitted by these {@code ObservableSource}s and then drains them + * in order, each one after the previous one completes. + *

+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code ObservableSource}s that need to be eagerly concatenated + * @return the new {@code Observable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @since 2.0 + */ + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Observable concatEager(@NonNull Iterable<@NonNull ? extends ObservableSource> sources) { + return concatEager(sources, bufferSize(), bufferSize()); + } + + /** + * Concatenates a sequence of {@link ObservableSource}s eagerly into a single stream of values and + * runs a limited number of inner sequences at once. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * {@code ObservableSource}s. The operator buffers the values emitted by these {@code ObservableSource}s and then drains them + * in order, each one after the previous one completes. + *

+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code ObservableSource}s that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code ObservableSource}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code ObservableSource}s can be active at the same time + * @param bufferSize the number of elements expected from each inner {@code ObservableSource} to be buffered + * @return the new {@code Observable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} or {@code bufferSize} is non-positive + * @since 2.0 + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Observable concatEager(@NonNull Iterable<@NonNull ? extends ObservableSource> sources, int maxConcurrency, int bufferSize) { + return fromIterable(sources).concatMapEagerDelayError((Function)Functions.identity(), false, maxConcurrency, bufferSize); + } + /** * Concatenates an {@link ObservableSource} sequence of {@code ObservableSource}s eagerly into a single stream of values. *

+ * + *

* Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the * emitted source {@code ObservableSource}s as they are observed. The operator buffers the values emitted by these * {@code ObservableSource}s and then drains them in order, each one after the previous one completes. - *

- * *

*
Scheduler:
*
This method does not operate by default on a particular {@link Scheduler}.
@@ -1486,13 +1542,15 @@ public static Observable concatEager(@NonNull ObservableSource + * *

* Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the * emitted source {@code ObservableSource}s as they are observed. The operator buffers the values emitted by these * {@code ObservableSource}s and then drains them in order, each one after the previous one completes. - *

- * *

*
Scheduler:
*
This method does not operate by default on a particular {@link Scheduler}.
@@ -1516,13 +1574,14 @@ public static Observable concatEager(@NonNull ObservableSource + * *

* Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the * {@code ObservableSource}s. The operator buffers the values emitted by these {@code ObservableSource}s and then drains them * in order, each one after the previous one completes. - *

- * *

*
Scheduler:
*
This method does not operate by default on a particular {@link Scheduler}.
@@ -1531,23 +1590,25 @@ public static Observable concatEager(@NonNull ObservableSource Observable concatEager(@NonNull Iterable<@NonNull ? extends ObservableSource> sources) { - return concatEager(sources, bufferSize(), bufferSize()); + public static Observable concatEagerDelayError(@NonNull Iterable<@NonNull ? extends ObservableSource> sources) { + return concatEagerDelayError(sources, bufferSize(), bufferSize()); } /** - * Concatenates a sequence of {@link ObservableSource}s eagerly into a single stream of values. + * Concatenates a sequence of {@link ObservableSource}s eagerly into a single stream of values, + * delaying errors until all the inner sequences terminate and runs a limited number of inner + * sequences at once. + *

+ * *

* Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the * {@code ObservableSource}s. The operator buffers the values emitted by these {@code ObservableSource}s and then drains them * in order, each one after the previous one completes. - *

- * *

*
Scheduler:
*
This method does not operate by default on a particular {@link Scheduler}.
@@ -1560,14 +1621,71 @@ public static Observable concatEager(@NonNull Iterable<@NonNull ? extends * @return the new {@code Observable} instance with the specified concatenation behavior * @throws NullPointerException if {@code sources} is {@code null} * @throws IllegalArgumentException if {@code maxConcurrency} or {@code bufferSize} is non-positive - * @since 2.0 + * @since 3.0.0 */ @SuppressWarnings({ "unchecked", "rawtypes" }) @CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) @NonNull - public static Observable concatEager(@NonNull Iterable<@NonNull ? extends ObservableSource> sources, int maxConcurrency, int bufferSize) { - return fromIterable(sources).concatMapEagerDelayError((Function)Functions.identity(), false, maxConcurrency, bufferSize); + public static Observable concatEagerDelayError(@NonNull Iterable<@NonNull ? extends ObservableSource> sources, int maxConcurrency, int bufferSize) { + return fromIterable(sources).concatMapEagerDelayError((Function)Functions.identity(), true, maxConcurrency, bufferSize); + } + + /** + * Concatenates an {@link ObservableSource} sequence of {@code ObservableSource}s eagerly into a single stream of values, + * delaying errors until all the inner and the outer sequence terminate. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code ObservableSource}s as they are observed. The operator buffers the values emitted by these + * {@code ObservableSource}s and then drains them in order, each one after the previous one completes. + *

+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code ObservableSource}s that need to be eagerly concatenated + * @return the new {@code Observable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @since 3.0.0 + */ + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Observable concatEagerDelayError(@NonNull ObservableSource> sources) { + return concatEagerDelayError(sources, bufferSize(), bufferSize()); + } + + /** + * Concatenates an {@link ObservableSource} sequence of {@code ObservableSource}s eagerly into a single stream of values, + * delaying errors until all the inner and the outer sequence terminate and runs a limited number of inner sequences at once. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code ObservableSource}s as they are observed. The operator buffers the values emitted by these + * {@code ObservableSource}s and then drains them in order, each one after the previous one completes. + *

+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code ObservableSource}s that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code ObservableSource}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code ObservableSource}s can be active at the same time + * @param bufferSize the number of inner {@code ObservableSource} expected to be buffered + * @return the new {@code Observable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} or {@code bufferSize} is non-positive + * @since 3.0.0 + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + @CheckReturnValue + @SchedulerSupport(SchedulerSupport.NONE) + @NonNull + public static Observable concatEagerDelayError(@NonNull ObservableSource> sources, int maxConcurrency, int bufferSize) { + return wrap(sources).concatMapEagerDelayError((Function)Functions.identity(), true, maxConcurrency, bufferSize); } /** @@ -2923,7 +3041,7 @@ public static Observable just(@NonNull T item1, @NonNull T item2, @NonNul * @return the new {@code Observable} instance * @throws NullPointerException if {@code sources} is {@code null} * @throws IllegalArgumentException - * if {@code maxConcurrent} or {@code bufferSize} is non-positive + * if {@code maxConcurrency} or {@code bufferSize} is non-positive * @see ReactiveX operators documentation: Merge * @see #mergeDelayError(Iterable, int, int) */ @@ -2971,7 +3089,7 @@ public static Observable merge(@NonNull Iterable<@NonNull ? extends Obser * @return the new {@code Observable} instance * @throws NullPointerException if {@code sources} is {@code null} * @throws IllegalArgumentException - * if {@code maxConcurrent} or {@code bufferSize} is non-positive + * if {@code maxConcurrency} or {@code bufferSize} is non-positive * @see ReactiveX operators documentation: Merge * @see #mergeArrayDelayError(int, int, ObservableSource...) */ diff --git a/src/main/java/io/reactivex/rxjava3/core/Single.java b/src/main/java/io/reactivex/rxjava3/core/Single.java index 667125b08b..ae60805e0d 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Single.java +++ b/src/main/java/io/reactivex/rxjava3/core/Single.java @@ -492,35 +492,6 @@ public static Flowable concatArrayEagerDelayError(@NonNull SingleSource - * - *

- * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the - * emitted source {@code SingleSource}s as they are observed. The operator buffers the values emitted by these - * {@code SingleSource}s and then drains them in order, each one after the previous one succeeds. - *

- *
Backpressure:
- *
Backpressure is honored towards the downstream and the outer {@code Publisher} is - * expected to support backpressure. Violating this assumption, the operator will - * signal {@link io.reactivex.rxjava3.exceptions.MissingBackpressureException}.
- *
Scheduler:
- *
This method does not operate by default on a particular {@link Scheduler}.
- *
- * @param the value type - * @param sources a sequence of {@code SingleSource}s that need to be eagerly concatenated - * @return the new {@link Flowable} instance with the specified concatenation behavior - * @throws NullPointerException if {@code sources} is {@code null} - */ - @BackpressureSupport(BackpressureKind.FULL) - @CheckReturnValue - @NonNull - @SchedulerSupport(SchedulerSupport.NONE) - public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends SingleSource> sources) { - return Flowable.fromPublisher(sources).concatMapEager(SingleInternalHelper.toFlowable()); - } - /** * Concatenates the {@link Iterable} sequence of {@link SingleSource}s into a single sequence by subscribing to each {@code SingleSource}, * one after the other, one at a time and delays any errors till the all inner {@code SingleSource}s terminate @@ -631,7 +602,227 @@ public static Flowable concatDelayError(@NonNull Publisher<@NonNull ? ext @NonNull @SchedulerSupport(SchedulerSupport.NONE) public static Flowable concatEager(@NonNull Iterable<@NonNull ? extends SingleSource> sources) { - return Flowable.fromIterable(sources).concatMapEager(SingleInternalHelper.toFlowable()); + return Flowable.fromIterable(sources).concatMapEagerDelayError(SingleInternalHelper.toFlowable(), false); + } + + /** + * Concatenates an {@link Iterable} sequence of {@link SingleSource}s eagerly into a single stream of values and + * runs a limited number of the inner sources at once. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * source {@code SingleSource}s. The operator buffers the values emitted by these {@code SingleSource}s and then drains them + * in order, each one after the previous one succeeds. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources an {@code Iterable} sequence of {@code SingleSource} that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code SingleSource}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code SingleSource}s can be active at the same time + * @return the new {@link Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + * @since 3.0.0 + */ + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @NonNull + @SchedulerSupport(SchedulerSupport.NONE) + public static Flowable concatEager(@NonNull Iterable<@NonNull ? extends SingleSource> sources, int maxConcurrency) { + return Flowable.fromIterable(sources).concatMapEagerDelayError(SingleInternalHelper.toFlowable(), false, maxConcurrency, 1); + } + + /** + * Concatenates a {@link Publisher} sequence of {@link SingleSource}s eagerly into a single stream of values. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code SingleSource}s as they are observed. The operator buffers the values emitted by these + * {@code SingleSource}s and then drains them in order, each one after the previous one succeeds. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and the outer {@code Publisher} is + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link io.reactivex.rxjava3.exceptions.MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code SingleSource}s that need to be eagerly concatenated + * @return the new {@link Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + */ + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @NonNull + @SchedulerSupport(SchedulerSupport.NONE) + public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends SingleSource> sources) { + return Flowable.fromPublisher(sources).concatMapEager(SingleInternalHelper.toFlowable()); + } + + /** + * Concatenates a {@link Publisher} sequence of {@link SingleSource}s eagerly into a single stream of values and + * runs a limited number of those inner {@code SingleSource}s at once. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code SingleSource}s as they are observed. The operator buffers the values emitted by these + * {@code SingleSource}s and then drains them in order, each one after the previous one succeeds. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and the outer {@code Publisher} is + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link io.reactivex.rxjava3.exceptions.MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code SingleSource}s that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code SingleSource}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code SingleSource}s can be active at the same time + * @return the new {@link Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + */ + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @NonNull + @SchedulerSupport(SchedulerSupport.NONE) + public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends SingleSource> sources, int maxConcurrency) { + return Flowable.fromPublisher(sources).concatMapEager(SingleInternalHelper.toFlowable(), maxConcurrency, 1); + } + + /** + * Concatenates an {@link Iterable} sequence of {@link SingleSource}s eagerly into a single stream of values, + * delaying errors until all the inner sources terminate. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * source {@code SingleSource}s. The operator buffers the values emitted by these {@code SingleSource}s and then drains them + * in order, each one after the previous one succeeds. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources an {@code Iterable} sequence of {@code SingleSource} that need to be eagerly concatenated + * @return the new {@link Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @since 3.0.0 + */ + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @NonNull + @SchedulerSupport(SchedulerSupport.NONE) + public static Flowable concatEagerDelayError(@NonNull Iterable<@NonNull ? extends SingleSource> sources) { + return Flowable.fromIterable(sources).concatMapEagerDelayError(SingleInternalHelper.toFlowable(), true); + } + + /** + * Concatenates an {@link Iterable} sequence of {@link SingleSource}s eagerly into a single stream of values, + * delaying errors until all the inner sources terminate. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * source {@code SingleSource}s. The operator buffers the values emitted by these {@code SingleSource}s and then drains them + * in order, each one after the previous one succeeds. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources an {@code Iterable} sequence of {@code SingleSource} that need to be eagerly concatenated + * @param maxConcurrency the maximum number of concurrently running inner {@code SingleSource}s; {@link Integer#MAX_VALUE} + * is interpreted as all inner {@code SingleSource}s can be active at the same time + * @return the new {@link Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + * @since 3.0.0 + */ + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @NonNull + @SchedulerSupport(SchedulerSupport.NONE) + public static Flowable concatEagerDelayError(@NonNull Iterable<@NonNull ? extends SingleSource> sources, int maxConcurrency) { + return Flowable.fromIterable(sources).concatMapEagerDelayError(SingleInternalHelper.toFlowable(), true, maxConcurrency, 1); + } + + /** + * Concatenates a {@link Publisher} sequence of {@link SingleSource}s eagerly into a single stream of values, + * delaying errors until all the inner and the outer sequence terminate. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code SingleSource}s as they are observed. The operator buffers the values emitted by these + * {@code SingleSource}s and then drains them in order, each one after the previous one succeeds. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and the outer {@code Publisher} is + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link io.reactivex.rxjava3.exceptions.MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code SingleSource}s that need to be eagerly concatenated + * @return the new {@link Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @since 3.0.0 + */ + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @NonNull + @SchedulerSupport(SchedulerSupport.NONE) + public static Flowable concatEagerDelayError(@NonNull Publisher<@NonNull ? extends SingleSource> sources) { + return Flowable.fromPublisher(sources).concatMapEagerDelayError(SingleInternalHelper.toFlowable(), true); + } + + /** + * Concatenates a {@link Publisher} sequence of {@link SingleSource}s eagerly into a single stream of values, + * running at most the specified number of those inner {@code SingleSource}s at once and + * delaying errors until all the inner and the outer sequence terminate. + *

+ * + *

+ * Eager concatenation means that once a subscriber subscribes, this operator subscribes to all of the + * emitted source {@code SingleSource}s as they are observed. The operator buffers the values emitted by these + * {@code SingleSource}s and then drains them in order, each one after the previous one succeeds. + *

+ *
Backpressure:
+ *
Backpressure is honored towards the downstream and the outer {@code Publisher} is + * expected to support backpressure. Violating this assumption, the operator will + * signal {@link io.reactivex.rxjava3.exceptions.MissingBackpressureException}.
+ *
Scheduler:
+ *
This method does not operate by default on a particular {@link Scheduler}.
+ *
+ * @param the value type + * @param sources a sequence of {@code SingleSource}s that need to be eagerly concatenated + * @param maxConcurrency the number of inner {@code SingleSource}s to run at once + * @return the new {@link Flowable} instance with the specified concatenation behavior + * @throws NullPointerException if {@code sources} is {@code null} + * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + * @since 3.0.0 + */ + @BackpressureSupport(BackpressureKind.FULL) + @CheckReturnValue + @NonNull + @SchedulerSupport(SchedulerSupport.NONE) + public static Flowable concatEagerDelayError(@NonNull Publisher<@NonNull ? extends SingleSource> sources, int maxConcurrency) { + return Flowable.fromPublisher(sources).concatMapEagerDelayError(SingleInternalHelper.toFlowable(), true, maxConcurrency, 1); } /** diff --git a/src/test/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableConcatMapEagerTest.java b/src/test/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableConcatMapEagerTest.java index 0adfd655b0..b8c2eaaff3 100644 --- a/src/test/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableConcatMapEagerTest.java +++ b/src/test/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableConcatMapEagerTest.java @@ -744,7 +744,7 @@ public void Flowable() { } @Test - public void ObservableCapacityHint() { + public void publisherCapacityHint() { Flowable source = Flowable.just(1); TestSubscriber ts = TestSubscriber.create(); @@ -1351,4 +1351,48 @@ public Flowable apply(Integer v) throws Throwable { } }); } + + @Test + public void iterableDelayError() { + Flowable.concatEagerDelayError(Arrays.asList( + Flowable.range(1, 2), + Flowable.error(new TestException()), + Flowable.range(3, 3) + )) + .test() + .assertFailure(TestException.class, 1, 2, 3, 4, 5); + } + + @Test + public void iterableDelayErrorMaxConcurrency() { + Flowable.concatEagerDelayError(Arrays.asList( + Flowable.range(1, 2), + Flowable.error(new TestException()), + Flowable.range(3, 3) + ), 1, 1) + .test() + .assertFailure(TestException.class, 1, 2, 3, 4, 5); + } + + @Test + public void publisherDelayError() { + Flowable.concatEagerDelayError(Flowable.fromArray( + Flowable.range(1, 2), + Flowable.error(new TestException()), + Flowable.range(3, 3) + )) + .test() + .assertFailure(TestException.class, 1, 2, 3, 4, 5); + } + + @Test + public void publisherDelayErrorMaxConcurrency() { + Flowable.concatEagerDelayError(Flowable.fromArray( + Flowable.range(1, 2), + Flowable.error(new TestException()), + Flowable.range(3, 3) + ), 1, 1) + .test() + .assertFailure(TestException.class, 1, 2, 3, 4, 5); + } } diff --git a/src/test/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeConcatEagerTest.java b/src/test/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeConcatEagerTest.java new file mode 100644 index 0000000000..5a1b42bb15 --- /dev/null +++ b/src/test/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeConcatEagerTest.java @@ -0,0 +1,152 @@ +/** + * Copyright (c) 2016-present, RxJava Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is + * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See + * the License for the specific language governing permissions and limitations under the License. + */ + +package io.reactivex.rxjava3.internal.operators.maybe; + +import java.util.Arrays; + +import org.junit.Test; + +import io.reactivex.rxjava3.core.*; +import io.reactivex.rxjava3.exceptions.TestException; + +public class MaybeConcatEagerTest { + + @Test + public void iterableNormal() { + Maybe.concatEager(Arrays.asList( + Maybe.just(1), + Maybe.empty(), + Maybe.just(2) + )) + .test() + .assertResult(1, 2); + } + + @Test + public void iterableNormalMaxConcurrency() { + Maybe.concatEager(Arrays.asList( + Maybe.just(1), + Maybe.empty(), + Maybe.just(2) + ), 1) + .test() + .assertResult(1, 2); + } + + @Test + public void iterableError() { + Maybe.concatEager(Arrays.asList( + Maybe.just(1), + Maybe.error(new TestException()), + Maybe.empty(), + Maybe.just(2) + )) + .test() + .assertFailure(TestException.class, 1); + } + + @Test + public void iterableErrorMaxConcurrency() { + Maybe.concatEager(Arrays.asList( + Maybe.just(1), + Maybe.error(new TestException()), + Maybe.empty(), + Maybe.just(2) + ), 1) + .test() + .assertFailure(TestException.class, 1); + } + + @Test + public void publisherNormal() { + Maybe.concatEager(Flowable.fromArray( + Maybe.just(1), + Maybe.empty(), + Maybe.just(2) + )) + .test() + .assertResult(1, 2); + } + + @Test + public void publisherNormalMaxConcurrency() { + Maybe.concatEager(Flowable.fromArray( + Maybe.just(1), + Maybe.empty(), + Maybe.just(2) + ), 1) + .test() + .assertResult(1, 2); + } + + @Test + public void publisherError() { + Maybe.concatEager(Flowable.fromArray( + Maybe.just(1), + Maybe.error(new TestException()), + Maybe.empty(), + Maybe.just(2) + )) + .test() + .assertFailure(TestException.class, 1); + } + + @Test + public void iterableDelayError() { + Maybe.concatEagerDelayError(Arrays.asList( + Maybe.just(1), + Maybe.error(new TestException()), + Maybe.empty(), + Maybe.just(2) + )) + .test() + .assertFailure(TestException.class, 1, 2); + } + + @Test + public void iterableDelayErrorMaxConcurrency() { + Maybe.concatEagerDelayError(Arrays.asList( + Maybe.just(1), + Maybe.error(new TestException()), + Maybe.empty(), + Maybe.just(2) + ), 1) + .test() + .assertFailure(TestException.class, 1, 2); + } + + @Test + public void publisherDelayError() { + Maybe.concatEagerDelayError(Flowable.fromArray( + Maybe.just(1), + Maybe.error(new TestException()), + Maybe.empty(), + Maybe.just(2) + )) + .test() + .assertFailure(TestException.class, 1, 2); + } + + @Test + public void publisherDelayErrorMaxConcurrency() { + Maybe.concatEagerDelayError(Flowable.fromArray( + Maybe.just(1), + Maybe.error(new TestException()), + Maybe.empty(), + Maybe.just(2) + ), 1) + .test() + .assertFailure(TestException.class, 1, 2); + } +} diff --git a/src/test/java/io/reactivex/rxjava3/internal/operators/observable/ObservableConcatMapEagerTest.java b/src/test/java/io/reactivex/rxjava3/internal/operators/observable/ObservableConcatMapEagerTest.java index e13124bf5d..054ab91d8f 100644 --- a/src/test/java/io/reactivex/rxjava3/internal/operators/observable/ObservableConcatMapEagerTest.java +++ b/src/test/java/io/reactivex/rxjava3/internal/operators/observable/ObservableConcatMapEagerTest.java @@ -1034,4 +1034,48 @@ public Observable apply(Integer v) throws Throwable { } }); } + + @Test + public void iterableDelayError() { + Observable.concatEagerDelayError(Arrays.asList( + Observable.range(1, 2), + Observable.error(new TestException()), + Observable.range(3, 3) + )) + .test() + .assertFailure(TestException.class, 1, 2, 3, 4, 5); + } + + @Test + public void iterableDelayErrorMaxConcurrency() { + Observable.concatEagerDelayError(Arrays.asList( + Observable.range(1, 2), + Observable.error(new TestException()), + Observable.range(3, 3) + ), 1, 1) + .test() + .assertFailure(TestException.class, 1, 2, 3, 4, 5); + } + + @Test + public void observerDelayError() { + Observable.concatEagerDelayError(Observable.fromArray( + Observable.range(1, 2), + Observable.error(new TestException()), + Observable.range(3, 3) + )) + .test() + .assertFailure(TestException.class, 1, 2, 3, 4, 5); + } + + @Test + public void observerDelayErrorMaxConcurrency() { + Observable.concatEagerDelayError(Observable.fromArray( + Observable.range(1, 2), + Observable.error(new TestException()), + Observable.range(3, 3) + ), 1, 1) + .test() + .assertFailure(TestException.class, 1, 2, 3, 4, 5); + } } diff --git a/src/test/java/io/reactivex/rxjava3/internal/operators/single/SingleConcatEagerTest.java b/src/test/java/io/reactivex/rxjava3/internal/operators/single/SingleConcatEagerTest.java new file mode 100644 index 0000000000..c21c5347d4 --- /dev/null +++ b/src/test/java/io/reactivex/rxjava3/internal/operators/single/SingleConcatEagerTest.java @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2016-present, RxJava Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is + * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See + * the License for the specific language governing permissions and limitations under the License. + */ + +package io.reactivex.rxjava3.internal.operators.single; + +import java.util.Arrays; + +import org.junit.Test; + +import io.reactivex.rxjava3.core.*; +import io.reactivex.rxjava3.exceptions.TestException; + +public class SingleConcatEagerTest { + + @Test + public void iterableNormal() { + Single.concatEager(Arrays.asList( + Single.just(1), + Single.just(2) + )) + .test() + .assertResult(1, 2); + } + + @Test + public void iterableNormalMaxConcurrency() { + Single.concatEager(Arrays.asList( + Single.just(1), + Single.just(2) + ), 1) + .test() + .assertResult(1, 2); + } + + @Test + public void iterableError() { + Single.concatEager(Arrays.asList( + Single.just(1), + Single.error(new TestException()), + Single.just(2) + )) + .test() + .assertFailure(TestException.class, 1); + } + + @Test + public void iterableErrorMaxConcurrency() { + Single.concatEager(Arrays.asList( + Single.just(1), + Single.error(new TestException()), + Single.just(2) + ), 1) + .test() + .assertFailure(TestException.class, 1); + } + + @Test + public void publisherNormal() { + Single.concatEager(Flowable.fromArray( + Single.just(1), + Single.just(2) + )) + .test() + .assertResult(1, 2); + } + + @Test + public void publisherNormalMaxConcurrency() { + Single.concatEager(Flowable.fromArray( + Single.just(1), + Single.just(2) + ), 1) + .test() + .assertResult(1, 2); + } + + @Test + public void publisherError() { + Single.concatEager(Flowable.fromArray( + Single.just(1), + Single.error(new TestException()), + Single.just(2) + )) + .test() + .assertFailure(TestException.class, 1); + } + + @Test + public void iterableDelayError() { + Single.concatEagerDelayError(Arrays.asList( + Single.just(1), + Single.error(new TestException()), + Single.just(2) + )) + .test() + .assertFailure(TestException.class, 1, 2); + } + + @Test + public void iterableDelayErrorMaxConcurrency() { + Single.concatEagerDelayError(Arrays.asList( + Single.just(1), + Single.error(new TestException()), + Single.just(2) + ), 1) + .test() + .assertFailure(TestException.class, 1, 2); + } + + @Test + public void publisherDelayError() { + Single.concatEagerDelayError(Flowable.fromArray( + Single.just(1), + Single.error(new TestException()), + Single.just(2) + )) + .test() + .assertFailure(TestException.class, 1, 2); + } + + @Test + public void publisherDelayErrorMaxConcurrency() { + Single.concatEagerDelayError(Flowable.fromArray( + Single.just(1), + Single.error(new TestException()), + Single.just(2) + ), 1) + .test() + .assertFailure(TestException.class, 1, 2); + } +} diff --git a/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java b/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java index 5c0886ea9d..aa388a684a 100644 --- a/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java +++ b/src/test/java/io/reactivex/rxjava3/internal/util/MarbleDimensions.java @@ -98,7 +98,7 @@ public static void main(String[] args) throws Throwable { } } - static final int SLEEP_PER_IMAGE_MILLIS = 100; + static final int SLEEP_PER_IMAGE_MILLIS = 25; static final Class[] CLASSES = { Flowable.class, Observable.class, Maybe.class, Single.class, Completable.class, ParallelFlowable.class diff --git a/src/test/java/io/reactivex/rxjava3/validators/ParamValidationNaming.java b/src/test/java/io/reactivex/rxjava3/validators/ParamValidationNaming.java index 2ce716e342..0445bfbe71 100644 --- a/src/test/java/io/reactivex/rxjava3/validators/ParamValidationNaming.java +++ b/src/test/java/io/reactivex/rxjava3/validators/ParamValidationNaming.java @@ -527,6 +527,7 @@ static final class ValidatorStrings { new ValidatorStrings("itemDelayIndicator", "* @throws NullPointerException"), new ValidatorStrings("future", "* @throws NullPointerException"), + new ValidatorStrings("maxConcurrency", "* @throws IllegalArgumentException"), new ValidatorStrings("parallelism", "* @throws IllegalArgumentException"), new ValidatorStrings("prefetch", "* @throws IllegalArgumentException"), new ValidatorStrings("bufferSize", "* @throws IllegalArgumentException"), From fae87707bf89553e1ed1da9ac0a19f144d23bf99 Mon Sep 17 00:00:00 2001 From: akarnokd Date: Thu, 30 Jan 2020 14:45:37 +0100 Subject: [PATCH 2/2] Add more since 3.0.0 tags --- src/main/java/io/reactivex/rxjava3/core/Maybe.java | 1 + src/main/java/io/reactivex/rxjava3/core/Single.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/io/reactivex/rxjava3/core/Maybe.java b/src/main/java/io/reactivex/rxjava3/core/Maybe.java index a00e2c7366..784343922d 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Maybe.java +++ b/src/main/java/io/reactivex/rxjava3/core/Maybe.java @@ -673,6 +673,7 @@ public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends * @return the new {@code Flowable} instance with the specified concatenation behavior * @throws NullPointerException if {@code sources} is {@code null} * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + * @since 3.0.0 */ @SuppressWarnings({ "rawtypes", "unchecked" }) @BackpressureSupport(BackpressureKind.FULL) diff --git a/src/main/java/io/reactivex/rxjava3/core/Single.java b/src/main/java/io/reactivex/rxjava3/core/Single.java index ae60805e0d..09c67ef5a1 100644 --- a/src/main/java/io/reactivex/rxjava3/core/Single.java +++ b/src/main/java/io/reactivex/rxjava3/core/Single.java @@ -690,6 +690,7 @@ public static Flowable concatEager(@NonNull Publisher<@NonNull ? extends * @return the new {@link Flowable} instance with the specified concatenation behavior * @throws NullPointerException if {@code sources} is {@code null} * @throws IllegalArgumentException if {@code maxConcurrency} is non-positive + * @since 3.0.0 */ @BackpressureSupport(BackpressureKind.FULL) @CheckReturnValue