本文章用的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;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)