RxJava源碼解析:操作符之map

前言

RxJava框架運用了裝飾設計模式(ps.叫靜態代理也行,關于兩種設計模式的區別
其中幾乎所有的操作符本質是都是new Obvservable(OnSubscribe<T> f),所以當你進行

Obvservable.create()
.map()
.lift
.subscribe()

等各種連點操作后,最原始的Obvservable對象早就被封裝了好幾層了。。。當然最終調用subscrib()方法的也肯定是最終被封裝后的Obvservable對象.

map源碼分析

map幾乎算所有操作符中最簡單的一個了, 看完map再看lift, 鵝妹子嚶~~~
Obvservable 中

    public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
        return create(new OnSubscribeMap<T, R>(this, func));
    }

其中create是所有操作符中都常用的一個靜態方法,本質就是new Obvservable(OnSubscribe<T> f),所以重點還是在于這個傳入的OnSubscribe對象:

重點在于將原始Subscriber封裝后的MapSubscriber的onNext方法,其他方法可忽略。

public final class OnSubscribeMap<T, R> implements OnSubscribe<R> {
    //原先的Observable
    final Observable<T> source;
    //自定義的轉換方法
    final Func1<? super T, ? extends R> transformer;

    public OnSubscribeMap(Observable<T> source, Func1<? super T, ? extends R> transformer) {
        this.source = source;
        this.transformer = transformer;
    }

    @Override
    public void call(final Subscriber<? super R> o) {
        MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
        //將新包裝后的MapSubscriber的subscription事件交給原先的Subscriber處理
        o.add(parent);
        // 下面一句話本質上調用的是source.onSubscribe.call(parent)
        source.unsafeSubscribe(parent);
    }

    static final class MapSubscriber<T, R> extends Subscriber<T> {

        final Subscriber<? super R> actual;

        final Func1<? super T, ? extends R> mapper;

        boolean done;

        public MapSubscriber(Subscriber<? super R> actual, Func1<? super T, ? extends R> mapper) {
            this.actual = actual;
            this.mapper = mapper;
        }

        @Override
        public void onNext(T t) {
            R result;

            try {
                //重點在這里
                result = mapper.call(t);
            } catch (Throwable ex) {
                ...
                unsubscribe();
                onError(OnErrorThrowable.addValueAsLastCause(ex, t));
                return;
            }

            actual.onNext(result);
        }

        @Override
        public void onError(Throwable e) {
            ...
            actual.onError(e);
        }

        @Override
        public void onCompleted() {
            ...
            actual.onCompleted();
        }

        ...
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容