本文章主要是对RxJava2的Map操作符进行源码分析,在阅读之前,可以先阅读以下文章:
本文章用的RxJava和RxAndroid版本如下:
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
我们先写段示例代码,为了方便理解,在调用map方法的时候,我就不用上Lambda和链式调用了,代码如下:
Observable.create((ObservableOnSubscribe<Integer>) emitter -> {
emitter.onNext(100);
emitter.onComplete();
})
.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) {
return integer.toString();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
// no implementation
}
@Override
public void onNext(String s) {
Log.i("TanJiaJun", "变换后的:" + s);
}
@Override
public void onError(Throwable e) {
// no implementation
}
@Override
public void onComplete() {
// no implementation
}
});
这段代码是将Integer类型的数据100变换为String类型的100后发射出去。
源码分析
我们看下map方法的源码,代码如下:
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
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));
}
参数是泛型接口Function<? super T, ? extends R>,有两个类型参数,第一个参数是一个下边界通配符(Lower Bounded Wildcard),对应逆变,可以存放T或T的父类型,第二个参数是一个上边界通配符(Upper Bounded Wildcard),对应协变,可以存放R或R的子类型。
根据前几篇文章的经验可知,我们只要看ObservableMap这个类就行了,代码如下:
public final class ObservableMap<T, U> extends AbstractObservableWithUpstream<T, U> {
final Function<? super T, ? extends U> function;
public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {
// source是上游Observable
super(source);
this.function = function;
}
@Override
public void subscribeActual(Observer<? super U> t) {
// 调用了上游Observable的subscribe方法,传入new出来的MapObserver对象,第一个参数是下游Observer,第二个参数是Function泛型接口
source.subscribe(new MapObserver<T, U>(t, function));
}
static final class MapObserver<T, U> extends BasicFuseableObserver<T, U> {
final Function<? super T, ? extends U> mapper;
MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
// actual是传进来的下游Observer,mapper是传进来的Function泛型接口
super(actual);
this.mapper = mapper;
}
@Override
public void onNext(T t) {
if (done) {
return;
}
if (sourceMode != NONE) {
downstream.onNext(null);
return;
}
// U是要转变的对象
U v;
try {
// 调用了Function泛型接口的apply方法,这是我们要重写的方法,参入的参数是转变前的对象
v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
} catch (Throwable ex) {
fail(ex);
return;
}
// 调用onNext方法,把转变后的对象发射出去
downstream.onNext(v);
}
@Override
public int requestFusion(int mode) {
return transitiveBoundaryFusion(mode);
}
@Nullable
@Override
public U poll() throws Exception {
T t = qd.poll();
return t != null ? ObjectHelper.<U>requireNonNull(mapper.apply(t), "The mapper function returned a null value.") : null;
}
}
}
我的GitHub:TanJiaJunBeyond
Android通用框架:Android通用框架
我的掘金:谭嘉俊
我的简书:谭嘉俊
我的CSDN:谭嘉俊
网友评论