RxJava ,lift()

702 阅读1分钟
@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()IntegerString

  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));