1、Single的map操作符基本使用
//注释1
Single<Integer> integerSingle = Single.just(1);
//注释2
Single<String> stringSingle = integerSingle.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) {
return "map:" + String.valueOf(integer);
}
});
//注释3
stringSingle.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(String s) {
Log.e("znh", "s:" + s);
}
@Override
public void onError(Throwable e) {
}
});
2、Single的map操作符源码:
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public final <R> Single<R> map(Function<? super T, ? extends R> mapper) {
ObjectHelper.requireNonNull(mapper, "mapper is null");
//注释4
return RxJavaPlugins.onAssembly(new SingleMap<T, R>(this, mapper));
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@NonNull
public static <T> Single<T> onAssembly(@NonNull Single<T> source) {
Function<? super Single, ? extends Single> f = onSingleAssembly;
if (f != null) {
return apply(f, source);
}
//注释5
return source;
}
注释4处的onAssembly方法里创建并传入了一个SingleMap对象,SingleMap的构造方法传入两个参数,一个Single对象自身this,一个是Function转换对象mapper。注释5处返回的source对象就是注释4处传入的SingleMap对象,由此可知,SingleMap也是Single的子类。注释2处的对象stringSingle就是SingleMap对象,SingleMap类的源码如下:
public final class SingleMap<T, R> extends Single<R> {
final SingleSource<? extends T> source;
final Function<? super T, ? extends R> mapper;
//注释6
public SingleMap(SingleSource<? extends T> source, Function<? super T, ? extends R> mapper) {
this.source = source;
this.mapper = mapper;
}
//注释7
@Override
protected void subscribeActual(final SingleObserver<? super R> t) {
source.subscribe(new MapSingleObserver<T, R>(t, mapper));
}
//注释8
static final class MapSingleObserver<T, R> implements SingleObserver<T> {
final SingleObserver<? super R> t;
final Function<? super T, ? extends R> mapper;
MapSingleObserver(SingleObserver<? super R> t, Function<? super T, ? extends R> mapper) {
this.t = t;
this.mapper = mapper;
}
@Override
public void onSubscribe(Disposable d) {
t.onSubscribe(d);
}
@Override
public void onSuccess(T value) {
R v;
try {
//注释9
v = ObjectHelper.requireNonNull(mapper.apply(value), "The mapper function returned a null value.");
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
onError(e);
return;
}
t.onSuccess(v);
}
@Override
public void onError(Throwable e) {
t.onError(e);
}
}
}
在注释6处的构造方法中,将注释4处传入的Single和Function对象保存到了成员变量source和mapper上,调用stringSingle的subscribe订阅方法,会继续调用其subscribeActual方法,在注释7处可以看到又调用了source的subscribe方法,这个source就是注释4处传入的初始的Single被观察者对象,参数里又创建了一个MapSingleObserver对象,并将自己定义的观察者t和转换类mapper作为构造参数,从注释8处可知,MapSingleObserver继承了SingleObserver,所以它也是一个观察者,当发生订阅关系的时候,会调用MapSingleObserver的onSubscribe方法、onError方法、onSuccess方法,然后在这些方法中,又会调用t(注释3处创建的SingleObserver对象)的相应方法完成数据流的传递过程。
在注释9处,调用t的onSuccess方法所传递的v值,是经过mapper.apply(value)转换过的值,这样就完成了数据的转换(本例是将Integer类型的转换为了String字符串),以上就是map操作符的执行流程。