
io.reactivex.interop.RxJava3Interop Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of rxjava3-interop Show documentation
Show all versions of rxjava3-interop Show documentation
rxjava3-interop developed by David Karnok
The newest version!
/**
* 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.interop;
import java.util.*;
import java.util.concurrent.Callable;
import org.reactivestreams.Publisher;
import io.reactivex.common.*;
import io.reactivex.common.Scheduler.Worker;
import io.reactivex.common.annotations.*;
import io.reactivex.common.functions.*;
import io.reactivex.common.internal.functions.*;
import io.reactivex.common.internal.utils.*;
import io.reactivex.flowable.*;
import io.reactivex.flowable.internal.operators.*;
import io.reactivex.interop.internal.operators.*;
import io.reactivex.observable.*;
import io.reactivex.observable.Observable;
/**
* The base utility class that hosts factory methods and
* functions to be used with the
* various base classes' {@code to(Function)} methods to
* enable interoperation between the base reactive types
* and some of their features.
* @since 3.0.0
*/
public final class RxJava3Interop {
private RxJava3Interop() {
throw new IllegalStateException("No instances!");
}
// --------------------------------------------------------------------------------------------------
// Base type conversions
// --------------------------------------------------------------------------------------------------
public static Flowable toFlowable(ObservableSource source, BackpressureStrategy strategy) {
ObjectHelper.requireNonNull(source, "source is null");
Flowable flowable = new FlowableFromObservable(source);
switch (strategy) {
case BUFFER:
flowable = flowable.onBackpressureBuffer();
break;
case DROP:
flowable = flowable.onBackpressureDrop();
break;
case ERROR:
flowable = new FlowableOnBackpressureError(flowable);
break;
case LATEST:
flowable = flowable.onBackpressureLatest();
break;
default:
}
return flowable;
}
public static Flowable toFlowable(SingleSource source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaFlowablePlugins.onAssembly(new SingleToFlowable(source));
}
public static Flowable toFlowable(MaybeSource source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaFlowablePlugins.onAssembly(new MaybeToFlowable(source));
}
public static Flowable toFlowable(CompletableSource source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaFlowablePlugins.onAssembly(new CompletableToFlowable(source));
}
public static Observable toObservable(Flowable source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaObservablePlugins.onAssembly(new ObservableFromPublisher(source));
}
// --------------------------------------------------------------------------------------------------
// Flowable operators that return a different basetype
// --------------------------------------------------------------------------------------------------
public static Single> toList(Flowable source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaObservablePlugins.onAssembly(new FlowableToListSingle>(source));
}
public static Single> toList(Flowable source, int capacityHint) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.verifyPositive(capacityHint, "capacityHint");
return RxJavaObservablePlugins.onAssembly(new FlowableToListSingle>(source, Functions.createArrayList(capacityHint)));
}
public static > Single toList(Flowable source, Callable collectionSupplier) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(collectionSupplier, "collectionSupplier is null");
return RxJavaObservablePlugins.onAssembly(new FlowableToListSingle(source, collectionSupplier));
}
public static Completable ignoreElements(Flowable source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaObservablePlugins.onAssembly(new FlowableIgnoreElementsCompletable(source));
}
public static Maybe reduce(Flowable source, BiFunction reducer) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(reducer, "reducer is null");
return RxJavaObservablePlugins.onAssembly(new FlowableReduceMaybe(source, reducer));
}
public static Single reduceWith(Flowable source, Callable seed, BiFunction reducer) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(seed, "seed is null");
ObjectHelper.requireNonNull(reducer, "reducer is null");
return RxJavaObservablePlugins.onAssembly(new FlowableReduceWithSingle(source, seed, reducer));
}
public static Single reduce(Flowable source, R seed, BiFunction reducer) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(seed, "seed is null");
ObjectHelper.requireNonNull(reducer, "reducer is null");
return RxJavaObservablePlugins.onAssembly(new FlowableReduceSeedSingle(source, seed, reducer));
}
public static Flowable flatMapSingle(Flowable source, Function super T, ? extends SingleSource extends R>> mapper) {
return flatMapSingle(source, mapper, false, Flowable.bufferSize());
}
public static Flowable flatMapSingle(Flowable source,
Function super T, ? extends SingleSource extends R>> mapper, boolean delayError, int maxConcurrency) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(mapper, "mapper is null");
ObjectHelper.verifyPositive(maxConcurrency, "maxConcurrency");
return RxJavaFlowablePlugins.onAssembly(new FlowableFlatMapSingle(source, mapper, delayError, maxConcurrency));
}
public static Flowable flatMapMaybe(Flowable source,
Function super T, ? extends MaybeSource extends R>> mapper) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(mapper, "mapper is null");
return flatMapMaybe(source, mapper, false, Flowable.bufferSize());
}
public static Flowable flatMapMaybe(Flowable source,
Function super T, ? extends MaybeSource extends R>> mapper, boolean delayError, int maxConcurrency) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(mapper, "mapper is null");
ObjectHelper.verifyPositive(maxConcurrency, "maxConcurrency");
return RxJavaFlowablePlugins.onAssembly(new FlowableFlatMapMaybe(source, mapper, delayError, maxConcurrency));
}
public static Completable flatMapCompletable(Flowable source,
Function super T, ? extends CompletableSource> mapper) {
return flatMapCompletable(source, mapper, false, Flowable.bufferSize());
}
public static Completable flatMapCompletable(Flowable source,
Function super T, ? extends CompletableSource> mapper, boolean delayError, int prefetch) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(mapper, "mapper is null");
ObjectHelper.verifyPositive(prefetch, "prefetch");
return RxJavaObservablePlugins.onAssembly(new FlowableFlatMapCompletableCompletable(source, mapper, delayError, prefetch));
}
public static Flowable flatMapPublisher(Single source, Function super T, ? extends Publisher extends R>> mapper) {
return toFlowable(source).flatMap(mapper);
}
public static Flowable flatMapPublisher(Maybe source, Function super T, ? extends Publisher extends R>> mapper) {
return toFlowable(source).flatMap(mapper);
}
public static Flowable flattenAsFlowable(Single source,
Function super T, ? extends Iterable extends R>> mapper) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(mapper, "mapper is null");
return RxJavaFlowablePlugins.onAssembly(new SingleFlatMapIterableFlowable(source, mapper));
}
public static Flowable flattenAsFlowable(Maybe source,
Function super T, ? extends Iterable extends R>> mapper) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(mapper, "mapper is null");
return RxJavaFlowablePlugins.onAssembly(new MaybeFlatMapIterableFlowable(source, mapper));
}
public static Completable concatCompletable(Flowable extends CompletableSource> sources) {
ObjectHelper.requireNonNull(sources, "sources is null");
return concatCompletable(sources, 2);
}
public static Completable concatCompletable(Flowable extends CompletableSource> sources, int prefetch) {
ObjectHelper.requireNonNull(sources, "sources is null");
ObjectHelper.verifyPositive(prefetch, "prefetch");
return RxJavaObservablePlugins.onAssembly(new CompletableConcat(sources, prefetch));
}
public static Completable mergeCompletable(Flowable extends CompletableSource> sources) {
return mergeCompletable(sources, Integer.MAX_VALUE);
}
public static Completable mergeCompletable(Flowable extends CompletableSource> sources, int maxConcurrency) {
ObjectHelper.requireNonNull(sources, "sources is null");
ObjectHelper.verifyPositive(maxConcurrency, "maxConcurrency");
return RxJavaObservablePlugins.onAssembly(new CompletableMerge(sources, maxConcurrency, false));
}
public static Completable mergeCompletableDelayError(Flowable extends CompletableSource> sources) {
return mergeCompletableDelayError(sources, Integer.MAX_VALUE);
}
public static Completable mergeCompletableDelayError(Flowable extends CompletableSource> sources, int maxConcurrency) {
ObjectHelper.requireNonNull(sources, "sources is null");
ObjectHelper.verifyPositive(maxConcurrency, "maxConcurrency");
return RxJavaObservablePlugins.onAssembly(new CompletableMerge(sources, maxConcurrency, true));
}
public static Flowable concatSingle(Flowable extends Single extends T>> sources) {
return concatSingle(sources, 2);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Flowable concatSingle(Flowable extends Single extends T>> sources, int prefetch) {
ObjectHelper.requireNonNull(sources, "sources is null");
ObjectHelper.verifyPositive(prefetch, "prefetch");
return RxJavaFlowablePlugins.onAssembly(new FlowableConcatMapPublisher(sources, InteropInternalHelper.toFlowable(), prefetch, ErrorMode.IMMEDIATE));
}
public static Flowable concatMaybe(Flowable extends Maybe extends T>> sources) {
return concatMaybe(sources, 2);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Flowable concatMaybe(Flowable extends Maybe extends T>> sources, int prefetch) {
ObjectHelper.requireNonNull(sources, "sources is null");
ObjectHelper.verifyPositive(prefetch, "prefetch");
return RxJavaFlowablePlugins.onAssembly(new FlowableConcatMapPublisher(sources, MaybeToPublisher.instance(), prefetch, ErrorMode.IMMEDIATE));
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Flowable mergeSingle(Flowable extends Single extends R>> sources) {
ObjectHelper.requireNonNull(sources, "sources is null");
return RxJavaFlowablePlugins.onAssembly(new FlowableFlatMapPublisher(sources, InteropInternalHelper.toFlowable(), false, Integer.MAX_VALUE, Flowable.bufferSize()));
}
public static Flowable mergeMaybe(Flowable extends Maybe extends R>> sources) {
return mergeMaybe(sources, Integer.MAX_VALUE);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Flowable mergeMaybe(Flowable extends Maybe extends R>> sources, int maxConcurrency) {
ObjectHelper.requireNonNull(sources, "source is null");
ObjectHelper.verifyPositive(maxConcurrency, "maxConcurrency");
return RxJavaFlowablePlugins.onAssembly(new FlowableFlatMapPublisher(sources, MaybeToPublisher.instance(), false, maxConcurrency, Flowable.bufferSize()));
}
public static Single first(Flowable source, T defaultItem) {
return elementAt(source, 0, defaultItem);
}
public static Single firstOrError(Flowable source) {
return elementAtOrError(source, 0);
}
public static Maybe firstElement(Flowable source) {
return elementAt(source, 0);
}
public static Single last(Flowable source, T defaultItem) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(defaultItem, "defaultItem is null");
return RxJavaObservablePlugins.onAssembly(new FlowableLastSingle(source, defaultItem));
}
public static Single lastOrError(Flowable source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaObservablePlugins.onAssembly(new FlowableLastSingle(source, null));
}
public static Maybe lastElement(Flowable source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaObservablePlugins.onAssembly(new FlowableLastMaybe(source));
}
public static Single single(Flowable source, T defaultItem) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(defaultItem, "defaultItem is null");
return RxJavaObservablePlugins.onAssembly(new FlowableSingleSingle(source, defaultItem));
}
public static Single singleOrError(Flowable source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaObservablePlugins.onAssembly(new FlowableSingleSingle(source, null));
}
public static Maybe singleElement(Flowable source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaObservablePlugins.onAssembly(new FlowableSingleMaybe(source));
}
public static Maybe elementAt(Flowable source, long index) {
ObjectHelper.requireNonNull(source, "source is null");
if (index < 0L) {
throw new IndexOutOfBoundsException("index >= 0 required but it was " + index);
}
return RxJavaObservablePlugins.onAssembly(new FlowableElementAtMaybe(source, index));
}
public static Single elementAt(Flowable source, long index, T defaultItem) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(defaultItem, "defaultItem is null");
if (index < 0L) {
throw new IndexOutOfBoundsException("index >= 0 required but it was " + index);
}
return RxJavaObservablePlugins.onAssembly(new FlowableElementAtSingle(source, index, defaultItem));
}
public static Single elementAtOrError(Flowable source, long index) {
ObjectHelper.requireNonNull(source, "source is null");
if (index < 0) {
throw new IndexOutOfBoundsException("index >= 0 required but it was " + index);
}
return RxJavaObservablePlugins.onAssembly(new FlowableElementAtSingle(source, index, null));
}
public static Single collect(Flowable source, Callable collectionSupplier, BiConsumer super C, ? super T> collector) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(collectionSupplier, "collectionSupplier is null");
ObjectHelper.requireNonNull(collector, "collector is null");
return RxJavaObservablePlugins.onAssembly(new FlowableCollectSingle(source, collectionSupplier, collector));
}
public static Single any(Flowable source, Predicate super T> predicate) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(predicate, "predicate is null");
return RxJavaObservablePlugins.onAssembly(new FlowableAnySingle(source, predicate));
}
public static Single all(Flowable source, Predicate super T> predicate) {
ObjectHelper.requireNonNull(source, "source is null");
ObjectHelper.requireNonNull(predicate, "predicate is null");
return RxJavaObservablePlugins.onAssembly(new FlowableAllSingle(source, predicate));
}
public static Single isEmpty(Flowable source) {
return all(source, Functions.alwaysFalse());
}
public static Single count(Flowable source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaObservablePlugins.onAssembly(new FlowableCountSingle(source));
}
/**
* Returns a Single that emits a single HashMap containing all items emitted by the source Publisher,
* mapped by the keys returned by a specified {@code keySelector} function.
*
*
*
* If more than one source item maps to the same key, the HashMap will contain the latest of those items.
*
* - Backpressure:
* - The operator honors backpressure from downstream and consumes the source {@code Publisher} in an
* unbounded manner (i.e., without applying backpressure to it).
* - Scheduler:
* - {@code toMap} does not operate by default on a particular {@link Scheduler}.
*
*
* @param the key type of the Map
* @param the source value type
* @param source the source Flowable instance
* @param keySelector
* the function that extracts the key from a source item to be used in the HashMap
* @return a Single that emits a single item: a HashMap containing the mapped items from the source
* Publisher
* @see ReactiveX operators documentation: To
*/
@CheckReturnValue
@BackpressureSupport(BackpressureKind.UNBOUNDED_IN)
@SchedulerSupport(SchedulerSupport.NONE)
public static Single