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返回的數據轉換到了下游

 

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