@@ -1718,7 +1718,11 @@ public final static <T> Observable<T> merge(Iterable<? extends Observable<? exte
17181718 * {@code source} Observable
17191719 * @see <a href="http://reactivex.io/documentation/operators/merge.html">ReactiveX operators documentation: Merge</a>
17201720 */
1721+ @ SuppressWarnings ({"unchecked" , "rawtypes" })
17211722 public final static <T > Observable <T > merge (Observable <? extends Observable <? extends T >> source ) {
1723+ if (source .getClass () == ScalarSynchronousObservable .class ) {
1724+ return ((ScalarSynchronousObservable <T >)source ).scalarFlatMap ((Func1 )UtilityFunctions .identity ());
1725+ }
17221726 return source .lift (OperatorMerge .<T >instance (false ));
17231727 }
17241728
@@ -1746,8 +1750,13 @@ public final static <T> Observable<T> merge(Observable<? extends Observable<? ex
17461750 * if {@code maxConcurrent} is less than or equal to 0
17471751 * @see <a href="http://reactivex.io/documentation/operators/merge.html">ReactiveX operators documentation: Merge</a>
17481752 */
1753+ @ Experimental
1754+ @ SuppressWarnings ({"unchecked" , "rawtypes" })
17491755 public final static <T > Observable <T > merge (Observable <? extends Observable <? extends T >> source , int maxConcurrent ) {
1750- return source .lift (new OperatorMergeMaxConcurrent <T >(maxConcurrent ));
1756+ if (source .getClass () == ScalarSynchronousObservable .class ) {
1757+ return ((ScalarSynchronousObservable <T >)source ).scalarFlatMap ((Func1 )UtilityFunctions .identity ());
1758+ }
1759+ return source .lift (OperatorMerge .<T >instance (false , maxConcurrent ));
17511760 }
17521761
17531762 /**
@@ -2018,7 +2027,31 @@ public final static <T> Observable<T> merge(Observable<? extends T> t1, Observab
20182027 public final static <T > Observable <T > merge (Observable <? extends T >[] sequences ) {
20192028 return merge (from (sequences ));
20202029 }
2021-
2030+
2031+ /**
2032+ * Flattens an Array of Observables into one Observable, without any transformation, while limiting the
2033+ * number of concurrent subscriptions to these Observables.
2034+ * <p>
2035+ * <img width="640" height="370" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/merge.io.png" alt="">
2036+ * <p>
2037+ * You can combine items emitted by multiple Observables so that they appear as a single Observable, by
2038+ * using the {@code merge} method.
2039+ * <dl>
2040+ * <dt><b>Scheduler:</b></dt>
2041+ * <dd>{@code merge} does not operate by default on a particular {@link Scheduler}.</dd>
2042+ * </dl>
2043+ *
2044+ * @param sequences
2045+ * the Array of Observables
2046+ * @param maxConcurrent
2047+ * the maximum number of Observables that may be subscribed to concurrently
2048+ * @return an Observable that emits all of the items emitted by the Observables in the Array
2049+ * @see <a href="http://reactivex.io/documentation/operators/merge.html">ReactiveX operators documentation: Merge</a>
2050+ */
2051+ @ Experimental
2052+ public final static <T > Observable <T > merge (Observable <? extends T >[] sequences , int maxConcurrent ) {
2053+ return merge (from (sequences ), maxConcurrent );
2054+ }
20222055 /**
20232056 * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to
20242057 * receive all successfully emitted items from all of the source Observables without being interrupted by
@@ -2046,6 +2079,37 @@ public final static <T> Observable<T> merge(Observable<? extends T>[] sequences)
20462079 public final static <T > Observable <T > mergeDelayError (Observable <? extends Observable <? extends T >> source ) {
20472080 return source .lift (OperatorMerge .<T >instance (true ));
20482081 }
2082+ /**
2083+ * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to
2084+ * receive all successfully emitted items from all of the source Observables without being interrupted by
2085+ * an error notification from one of them, while limiting the
2086+ * number of concurrent subscriptions to these Observables.
2087+ * <p>
2088+ * This behaves like {@link #merge(Observable)} except that if any of the merged Observables notify of an
2089+ * error via {@link Observer#onError onError}, {@code mergeDelayError} will refrain from propagating that
2090+ * error notification until all of the merged Observables have finished emitting items.
2091+ * <p>
2092+ * <img width="640" height="380" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/mergeDelayError.png" alt="">
2093+ * <p>
2094+ * Even if multiple merged Observables send {@code onError} notifications, {@code mergeDelayError} will only
2095+ * invoke the {@code onError} method of its Observers once.
2096+ * <dl>
2097+ * <dt><b>Scheduler:</b></dt>
2098+ * <dd>{@code mergeDelayError} does not operate by default on a particular {@link Scheduler}.</dd>
2099+ * </dl>
2100+ *
2101+ * @param source
2102+ * an Observable that emits Observables
2103+ * @param maxConcurrent
2104+ * the maximum number of Observables that may be subscribed to concurrently
2105+ * @return an Observable that emits all of the items emitted by the Observables emitted by the
2106+ * {@code source} Observable
2107+ * @see <a href="http://reactivex.io/documentation/operators/merge.html">ReactiveX operators documentation: Merge</a>
2108+ */
2109+ @ Experimental
2110+ public final static <T > Observable <T > mergeDelayError (Observable <? extends Observable <? extends T >> source , int maxConcurrent ) {
2111+ return source .lift (OperatorMerge .<T >instance (true , maxConcurrent ));
2112+ }
20492113
20502114 /**
20512115 * Flattens two Observables into one Observable, in a way that allows an Observer to receive all
@@ -4649,6 +4713,9 @@ public final Observable<T> firstOrDefault(T defaultValue, Func1<? super T, Boole
46494713 * @see <a href="http://reactivex.io/documentation/operators/flatmap.html">ReactiveX operators documentation: FlatMap</a>
46504714 */
46514715 public final <R > Observable <R > flatMap (Func1 <? super T , ? extends Observable <? extends R >> func ) {
4716+ if (getClass () == ScalarSynchronousObservable .class ) {
4717+ return ((ScalarSynchronousObservable <T >)this ).scalarFlatMap (func );
4718+ }
46524719 return merge (map (func ));
46534720 }
46544721
@@ -4677,6 +4744,9 @@ public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? e
46774744 */
46784745 @ Beta
46794746 public final <R > Observable <R > flatMap (Func1 <? super T , ? extends Observable <? extends R >> func , int maxConcurrent ) {
4747+ if (getClass () == ScalarSynchronousObservable .class ) {
4748+ return ((ScalarSynchronousObservable <T >)this ).scalarFlatMap (func );
4749+ }
46804750 return merge (map (func ), maxConcurrent );
46814751 }
46824752
0 commit comments