美文网首页
RxJava2源码分析——Map操作符

RxJava2源码分析——Map操作符

作者: 谭嘉俊 | 来源:发表于2019-10-31 02:14 被阅读0次

    本文章主要是对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:谭嘉俊

    相关文章

      网友评论

          本文标题:RxJava2源码分析——Map操作符

          本文链接:https://www.haomeiwen.com/subject/alhzvctx.html