本文章主要是对RxJava2的Map操做符进行源码分析,在阅读以前,能够先阅读如下文章:java
RxJava2源码分析——订阅react
RxJava2源码分析——线程切换android
本文章用的RxJava和RxAndroid版本以下:git
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
复制代码
咱们先写段示例代码,为了方便理解,在调用map方法的时候,我就不用上Lambda和链式调用了,代码以下:github
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后发射出去。app
咱们看下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的子类型。ide
根据前几篇文章的经验可知,咱们只要看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:TanJiaJunBeyondui
Android通用框架:Android通用框架(Kotlin-MVVM)
个人掘金:谭嘉俊
个人简书:谭嘉俊