@CheckReturnValue
@BackpressureSupport(BackpressureKind.SPECIAL)
@SchedulerSupport(SchedulerSupport.NONE)
public final <R> Flowable<R> lift(FlowableOperator<? extends R, ? super T> lifter) {
ObjectHelper.requireNonNull(lifter, "lifter is null");
return RxJavaPlugins.onAssembly(new FlowableLift<R, T>(this, lifter));
}
关键代码
public final <R> Flowable<R> lift(FlowableOperator<? extends R, ? super T> lifter) {
return new FlowableLift<R, T>(this, lifter);
}
函数返回了一个FlowableLift对象。
public final class FlowableLift<R, T> extends AbstractFlowableWithUpstream<T, R> {
final FlowableOperator<? extends R, ? super T> operator;
public FlowableLift(Flowable<T> source, FlowableOperator<? extends R, ? super T> operator) {
super(source);
this.operator = operator;
}
@Override
public void subscribeActual(Subscriber<? super R> s) {
//...
Subscriber<? super T> st = operator.apply(s);
//...
source.subscribe(st);
//...
}
public FlowableLift(Flowable<T> source...
source = Flowable-1
FlowableLift = Flowable-2
public void subscribeActual(Subscriber<? super R> s) {
Subscriber<? super T> st = operator.apply(s);
s = Subscriber-1
st = Subscriber-2
此时有两个Flowable,(原始的和 return创建的)。[Flowable-1,Flowable-2]
当调用lift()之后对象的subscribe()方法时,调用的是return创建的Flowable-2#subscriber(),于是它触发了 source.subscribe(st)
此时source是原始的Flowable-1对象,而st是通过operator.apply(s)生成的Subscriber-2对象。[Subscriber-1,Subscriber-2]
operator通过call方法将原始的Subcsriber-1对象变换成了一个新的Subscriber-2
然后将新的Subscriber-2对象与原始的Flowable-1对象关联起来source.subscribe(st);
这样就实现了lift()的过程
lift() 的 Integer转String
Flowable<Integer> flowable = Flowable.create(e -> {
Timber.d("e = %s", e.getClass().getSimpleName());
e.onNext(0);
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}, BackpressureStrategy.MISSING);
Flowable<String> lift = flowable.lift(observer -> new Subscriber<Integer>() {
@Override
public void onSubscribe(Subscription s) {
s.request(4);
}
@Override
public void onNext(Integer integer) {
observer.onNext(integer.toString());
}
@Override
public void onError(Throwable t) {
observer.onError(t);
}
@Override
public void onComplete() {
observer.onComplete();
}
});
lift.subscribe(s -> Timber.d("s = %s", s));