阅读 382

RxJava2源码分析——Map操作符

本文章主要是对RxJava2Map操作符进行源码分析,在阅读之前,可以先阅读以下文章:

RxJava2源码分析——订阅

RxJava2源码分析——线程切换

本文章用的RxJavaRxAndroid版本如下:

implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
复制代码

我们先写段示例代码,为了方便理解,在调用map方法的时候,我就不用上Lambda链式调用了,代码如下:

Observable.create((ObservableOnSubscribe<Integer>) emitter -> {
    emitter.onNext(100);
    emitter.onComplete();
})
        .map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) {
                return integer.toString();
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                // no implementation
            }

            @Override
            public void onNext(String s) {
                Log.i("TanJiaJun", "变换后的:" + s);
            }

            @Override
            public void onError(Throwable e) {
                // no implementation
            }

            @Override
            public void onComplete() {
                // no implementation
            }
        });
复制代码

这段代码是将Integer类型的数据100变换为String类型的100后发射出去。

源码分析

我们看下map方法的源码,代码如下:

@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
    ObjectHelper.requireNonNull(mapper, "mapper is null");
    return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
}
复制代码

参数是泛型接口Function<? super T, ? extends R>,有两个类型参数,第一个参数是一个下边界通配符(Lower Bounded Wildcard),对应逆变,可以存放TT的父类型,第二个参数是一个上边界通配符(Upper Bounded Wildcard),对应协变,可以存放RR的子类型。

根据前几篇文章的经验可知,我们只要看ObservableMap这个类就行了,代码如下:

public final class ObservableMap<T, U> extends AbstractObservableWithUpstream<T, U> {
    final Function<? super T, ? extends U> function;

    public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {
        // source是上游Observable
        super(source);
        this.function = function;
    }

    @Override
    public void subscribeActual(Observer<? super U> t) {
        // 调用了上游Observable的subscribe方法,传入new出来的MapObserver对象,第一个参数是下游Observer,第二个参数是Function泛型接口
        source.subscribe(new MapObserver<T, U>(t, function));
    }

    static final class MapObserver<T, U> extends BasicFuseableObserver<T, U> {
        final Function<? super T, ? extends U> mapper;

        MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
            // actual是传进来的下游Observer,mapper是传进来的Function泛型接口
            super(actual);
            this.mapper = mapper;
        }

        @Override
        public void onNext(T t) {
            if (done) {
                return;
            }

            if (sourceMode != NONE) {
                downstream.onNext(null);
                return;
            }

            // U是要转变的对象
            U v;

            try {
                // 调用了Function泛型接口的apply方法,这是我们要重写的方法,参入的参数是转变前的对象
                v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
            } catch (Throwable ex) {
                fail(ex);
                return;
            }
            // 调用onNext方法,把转变后的对象发射出去
            downstream.onNext(v);
        }

        @Override
        public int requestFusion(int mode) {
            return transitiveBoundaryFusion(mode);
        }

        @Nullable
        @Override
        public U poll() throws Exception {
            T t = qd.poll();
            return t != null ? ObjectHelper.<U>requireNonNull(mapper.apply(t), "The mapper function returned a null value.") : null;
        }
    }
}
复制代码

我的GitHub:TanJiaJunBeyond

Android通用框架:Android通用框架

我的掘金:谭嘉俊

我的简书:谭嘉俊

我的CSDN:谭嘉俊

文章分类
Android
文章标签