RxJava1.x操作符初探之map

8 篇文章 0 订阅
4 篇文章 0 订阅

我们先来看看map操作符:

    Observable.just(1, 2, 3)
        .map(object : Func1<Int, String> {
             override fun call(t: Int?): String {
                return t.toString()
            }
        })

总结

map主要就是把最初的Subscriber1转化成MapSubscriber,交给Observable1,即OnSubscribe1处理
MapSubscriber,这时候MapSubscriber内部会先调用Map的参数Func来转换类型,最后再交给Subscriber1

那来看看map到底执行了什么吧:

Observable.java:

    public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
    //新建了一个Observable2,同时OnSubscribe2为OnSubscribeMap
        return create(new OnSubscribeMap<T, R>(this, func));
    }
    
    
OnSubscribeMap.java:

    public OnSubscribeMap(Observable<T> source, Func1<? super T, ? extends R> transformer) {
    //这个是Observable1
        this.source = source;
        this.transformer = transformer;
    }
    
    public void call(final Subscriber<? super R> o) {
    //重新封装Subscriber成MapSubscriber
        MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
        o.add(parent);
        //执行MapSubscriber的onNext方法
        source.unsafeSubscribe(parent);
    }

MapSubscriber.java:

        public MapSubscriber(Subscriber<? super R> actual, Func1<? super T, ? extends R> mapper) {
         //actual是最初的Subscriber1
            this.actual = actual;
            //mapper就是map后面的Func1参数
            this.mapper = mapper;
        }

        @Override
        public void onNext(T t) {
            R result;
            try {
                //这步主要是为了转换类型
                result = mapper.call(t);
            } catch (Throwable ex) {
                Exceptions.throwIfFatal(ex);
                unsubscribe();
                onError(OnErrorThrowable.addValueAsLastCause(ex, t));
                return;
            }
            
            actual.onNext(result);
        }

最后来看看整个过程的流程图吧:

graph RL
    subgraph Observable
    Observable1-->Observable1.create{create}
    OnSubscribe1((OnSubscribe1))
    end
    
    subgraph ObservableMap
    Observable2
    OnSubscribe2((OnSubscribe2))
    end
    
    Observable1.create-->Observable2
    Subscriber1-->OnSubscribe2
    
    subgraph Subscriber
    MapSubscriber
    MapSubscriber.onNext{onNext}
    end
    
    subgraph Subscriber
    Subscriber1
    Subscriber1.onNext{onNext}
    end
 
 OnSubscribe2-->MapSubscriber
 MapSubscriber-->Observable1
 Observable1-->OnSubscribe1
 OnSubscribe1-->OnSubscribe1.call{call}
 OnSubscribe1.call-->MapSubscriber.onNext
     subgraph Func
     func1
     func1.call{call}
     end
     
     MapSubscriber.onNext-->func1.call
     func1.call-->Subscriber1.onNext

流程图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值