@@ -1718,7 +1718,11 @@ public final static <T> Observable<T> merge(Iterable<? extends Observable<? exte
1718
1718
* {@code source} Observable
1719
1719
* @see <a href="http://reactivex.io/documentation/operators/merge.html">ReactiveX operators documentation: Merge</a>
1720
1720
*/
1721
+ @ SuppressWarnings ({"unchecked" , "rawtypes" })
1721
1722
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
+ }
1722
1726
return source .lift (OperatorMerge .<T >instance (false ));
1723
1727
}
1724
1728
@@ -1746,8 +1750,13 @@ public final static <T> Observable<T> merge(Observable<? extends Observable<? ex
1746
1750
* if {@code maxConcurrent} is less than or equal to 0
1747
1751
* @see <a href="http://reactivex.io/documentation/operators/merge.html">ReactiveX operators documentation: Merge</a>
1748
1752
*/
1753
+ @ Experimental
1754
+ @ SuppressWarnings ({"unchecked" , "rawtypes" })
1749
1755
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 ));
1751
1760
}
1752
1761
1753
1762
/**
@@ -2018,7 +2027,31 @@ public final static <T> Observable<T> merge(Observable<? extends T> t1, Observab
2018
2027
public final static <T > Observable <T > merge (Observable <? extends T >[] sequences ) {
2019
2028
return merge (from (sequences ));
2020
2029
}
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
+ }
2022
2055
/**
2023
2056
* Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to
2024
2057
* 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)
2046
2079
public final static <T > Observable <T > mergeDelayError (Observable <? extends Observable <? extends T >> source ) {
2047
2080
return source .lift (OperatorMerge .<T >instance (true ));
2048
2081
}
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
+ }
2049
2113
2050
2114
/**
2051
2115
* 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
4649
4713
* @see <a href="http://reactivex.io/documentation/operators/flatmap.html">ReactiveX operators documentation: FlatMap</a>
4650
4714
*/
4651
4715
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
+ }
4652
4719
return merge (map (func ));
4653
4720
}
4654
4721
@@ -4677,6 +4744,9 @@ public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? e
4677
4744
*/
4678
4745
@ Beta
4679
4746
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
+ }
4680
4750
return merge (map (func ), maxConcurrent );
4681
4751
}
4682
4752
0 commit comments