RxJava2的map操作符用于对输入对象进行转换。
下图所示为将String的输出转化为Integer的场景。
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操作符用法涉及到的基本类。
下图所示为map操作符的调用序列图:
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函数。自此,整个调用链结束。