前面几篇,我们大致了解了Rxjava的流程,这里来看一下rxjava中的操作符,我们来一个简单一点的操作符,map符
var sources = object : ObservableOnSubscribe<String> {
override fun subscribe(emitter: ObservableEmitter<String>) {
emitter.onNext("下一步")
emitter.onComplete()
}
}
var observable = Observable.create(sources)
var map = object : Function<String, Int> {
override fun apply(t: String): Int {
return 1
}
}
var observable3 = observable.map(map)
map符能将我们的数据转化的任意类型,这里我们将string转成int,来看 observable.map(map)做了什么
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
ObjectHelper.requireNonNull(mapper, "mapper is null");
//很熟悉,返回ObservableMap对象
return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
}
根据前面的分析,下面就走到了ObservableMap的subscribeActual方法中
@Override
public void subscribeActual(Observer<? super U> t) {
//重新subscribe
source.subscribe(new MapObserver<T, U>(t, function));
}
到这里就很熟悉,和前面线程的切换有点像,当调用onNext()方法时,会走到MapObserver的onNext()方法
@Override
public void onNext(T t) {
if (done) {
return;
}
if (sourceMode != NONE) {
downstream.onNext(null);
return;
}
U v;
try {
//调用mapper.apply(t)方法,获取返回值
v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
} catch (Throwable ex) {
fail(ex);
return;
}
//调用observer的onNext,并将转化后的数据当作参数传过去
downstream.onNext(v);
}
通过上面可以知道使用mapper.apply(t)来进行数据类型的转化,其中mapper就是我们调用observable.map(map)的map对象,所以就走到了我们的转化方法中
var map = object : Function<String, Int> {
override fun apply(t: String): Int {
//就会来到这里,这里的返回值就是observer的onNext方法接收的值
return 1
}
}
到这里,map操作符就实现的类型的变化,其他的操作符,基本都是这样一个原理。
网友评论