Rxjava从使用到原码的解析十二: Rxjava转换型操作符map原码解析

上一篇讲了创建型操作符,里面需要传个一个泛型假设为String,那么下游接收的泛型也是String

map操作符的作用就是,假设我下游需要接收的是一个Bitmap那这个时候就需要类型来转换.

下来来分析下Rxjava是如果做到泛型转换的,先来看来.map的代码

    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));
    }

.map的时候返回的是一个带R泛型的Observable<R>被观察者 ,再传入了一个Function参数,Function里有二个泛型? super T, ? extends R

这里简单介绍下泛型里的super 和extends

<? extends R > 控制其上限,最高只能是R 这里传Object就不行,只能是R or R的子类
<? extends R >  可读不可写,
<? super T > 控制其下限,最低只能是T, 这样传Object也是可以的 只能是T或者是他的父类
<? super T >  可与,不完全可读

Function是一个接口,里面就一个方法

public interface Function<T, R> {
    @NonNull
    R apply(@NonNull T t) throws Exception;
}

所以我们执行map操作符的时候会重写这个apply方法,也就是将原来的T泛型转换为就换后的R泛型,

接着上面分析,在map操作符里面返回的是一个ObservableMap,ObservableMap它也是一个被观察者来看看他的继承关系

超父类: Observable<U> 泛型为U
        父类: AbstractObservableWithUpstream<T, U> 泛型为T 和U ,把泛型U传给超父类
              自己: ObservableMap<T, U>  泛型为T 和 U,   T和 U直接传给父类

有了上面这层关系,当我们通过create的时候传的的泛型为 T,假设我们传入的是String 也就是说被观察的泛型为String,

在map操作符的方法之上有个泛型R  假设我们把这个R传入的是Bitmap这个时候我们创建ObservableMap的时候就把String,Bitmap当作参数传过来

new ObservableMap<String, Bitmap>(this, mapper)

this就是Observable<String>, 

mapper就是Function<? super String, ? extends Bitmap> mapper

上面可以看出ObservableMap的泛型为<String, Bitmap>,给父类的也是AbstractObservableWithUpstream<String, Bitmap>,再给超父类也就是Observable的泛型就是<Bitmap>,成功实行的泛型的转换.

因为ObservableMap的超父类是Observable,所以在执行subscribe的时候也是执行他的subscribeActual抽象方法,这个方法是由其子类也实现也就是ObservableMap

    public void subscribeActual(Observer<? super U> t) {
        source.subscribe(new MapObserver<T, U>(t, function));
    }

上面的这个source就是通过创建操作符创建的Observable也就是ObservableCreate

 source.subscribe(new MapObserver<T, U>(t, function));就是执行

ObservableCreate.subscribe(..)方法,而这个MapObserver他实现了Observer接口,并执有了原始观察者Observer的引用,

在MapObserver的onNext方法中,

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

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

            U v;

            try {
                v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
            } catch (Throwable ex) {
                fail(ex);
                return;
            }
            actual.onNext(v);
        }

最终就是通过Function里面的实现方法apply返回的数据转换到了下游

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章