RxJava的操作符有很多,一般常用的有变换操作符,其中最主要是map和flatMap,本文将分别来讲解一下它们的实现原理。在上一篇文章:RxJava 2.x 源码分析(二) 线程切换原理中,讲到RxJava框架的执行流程,理解这个对我们源码的阅读是有很大帮助的,所以如果你还不懂的话,请移步到上一篇文章去读一下
一:map的实现原理
老规矩,先上一个例子:
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onNext(4);
}
}).map(new Function<Integer, String>() {
@Override
public String apply(@NonNull Integer integer) throws Exception {
return "This is result " + integer;
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
mRxOperatorsText.append("accept : " + s +"\n");
Log.d(TAG, "accept : " + s +"\n" );
}
});
输出结果:
在例子中,map函数通过参数Function的接口方法apply,将Observable发射的整型数据转换成了String字符串,这就是map的变换功能了,它可以将收到的上游数据,根据自己的需要作相关处理,再将数据传递给下游
切入到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));
}
public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {
super(source);
this.function = function;
}
@Override
public void subscribeActual(Observer<? super U> t) {
source.subscribe(new MapObserver<T, U>(t, function));
}
函数返回一个ObservableMap实例,这是一个新的可观察者,关注它的subscribeActual方法,可以看到生成一个新的观察者MapObserver,这就是负责变换数据的观察者了,其中传递的第一个参数为下一级观察者,第二个参数m