RxJava2的map操作符用于对输入对象进行转换。
![img_ea8733a04868a64e6e2a9ed9650ae03c.png](https://yqfile.alicdn.com/img_ea8733a04868a64e6e2a9ed9650ae03c.png?x-oss-process=image/resize,w_1400/format,webp)
下图所示为将String的输出转化为Integer的场景。
![img_0c285006f23bc6765a033c68aade48b2.png](https://yqfile.alicdn.com/img_0c285006f23bc6765a033c68aade48b2.png?x-oss-process=image/resize,w_1400/format,webp)
Map的源码解析如下,首先涉及到以下几个类:
1、Observable:被观察者,通过Observable.create创建一个被观察者,即观察者模式里面的主题Subject对象。被观察者对象通过ObservableEmitter发送消息给观察者
2、ObserverOnSubscriber:类似于观察者模式中的用来通知被观察者的notifyObserver接口。
3、Observer:观察者实现类
4、subscriber方法:订阅,Observer观察者订阅Observable内容。
5、ObservableCreate:调用Observerable.create生成的类。
6、ObservableMap:调用map后生成的对象。
7、Function:将String转化为Integer的函数。
8、MapObserver:map后再subscribe生成的观察者,内部保存了原始的观察者,和Funcation函数。
下图所示的最基本的Map操作符用法涉及到的基本类。
![img_2b08bc1b25901aaf2026b3f50ab7d292.png](https://yqfile.alicdn.com/img_2b08bc1b25901aaf2026b3f50ab7d292.png?x-oss-process=image/resize,w_1400/format,webp)
下图所示为map操作符的调用序列图:
![img_a0ade401973d250a224c6bdcc8d9330e.png](https://yqfile.alicdn.com/img_a0ade401973d250a224c6bdcc8d9330e.png?x-oss-process=image/resize,w_1400/format,webp)
1、Observable.create(ObservableOnSubscribe)会创建ObservableCreate对象,并将ObservableOnSubscribe赋值给ObservableCreate的source变量。
2、Observable.map(Function),此时实际的Observable是ObservableCreate对象,map会创建ObservableMap对象,并将ObservableCreate赋值给source变量,将Function函数赋值给function变量。
3、Observable.subscribe(Observer),此时实际的Observable是ObservableMap对象,操作流程如下:
3.1、subscribe会调用ObservableMap的subscribeActual;该方法会在ObservableMap内部创建一个MapObserver(Function,Observer),传入原始Observer和Function函数;创建完MapObserver后会调用ObservableCreate.subscribe(MapObserver);
3.2、ObservableCreate.subscribe(MapObserver)方法实际是调用父类Observable.subscribe(MapObserver)函数;
3.3、调用Observable.subscribe(MapObserver)时,此时Observable对象实际是ObservableCreate,所以调用ObservableCreate.subscribeActual(MapObserver);
3.4、ObservableCreate.subscribeActual会创建CreateEmitter(MapObserver),然后调用ObservableOnSubscribe.subscribe(CreateEmitter);
3.5、最终调用到CreateEmitter.onNext(String),由于CreateEmitter已经传入了MapObserver,所以onNext会先调用Function.apply进行数据变换(这里也就是Integer.parseInt),得到变换后的数据后,在调用MapObserver中的原始Observer的onNext函数。自此,整个调用链结束。