响应式编程之Map

248 阅读1分钟

image.png 定义一个方法用来处理异步源的每一个结果,对这些结果进行一种转换变成新的数据,然后继续下发给原来的observer。

1、Observable

public final void subscribe(@NonNull Observer<? super T> observer) {
    observer = RxJavaPlugins.onSubscribe(this, observer);
    subscribeActual(observer);
}

2、ObservableMap

public final class ObservableMap<T, U> extends AbstractObservableWithUpstream<T, U> {
 
    public ObservableMap(ObservableSource<T> source, Function function) {
        super(source);//just相关的Observable
        this.function = function;
    }
}
public void subscribeActual(Observer<? super U> t) {
    //模板模式:调用抽象类Observable
    source.subscribe(new MapObserver<T, U>(t, function));
}

2.1、MapObserver

Map相关的观察者。

static final class MapObserver<T, U> extends BasicFuseableObserver<T, U> {
   
    MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
        super(actual);
        this.mapper = mapper;
    }
    
   
    public void onNext(T t) {
        if (done) {
            return;
        }
        if (sourceMode != NONE) {
            downstream.onNext(null);
            return;
        }
        U v = mapper.apply(t);//执行map功能
        downstream.onNext(v);//调用自定义观察者之onNext
    }
}

2.2、BasicFuseableObserver

public abstract class BasicFuseableObserver{
   
    public BasicFuseableObserver(Observer<? super R> downstream) {
        this.downstream = downstream;
    }
    
    public final void onSubscribe(Disposable d) {
        if (DisposableHelper.validate(this.upstream, d)) {
            this.upstream = d;
            if (beforeDownstream()) {
                //调用自定义的观察者
                downstream.onSubscribe(this);
                afterDownstream();
            }

        }
    }
}

3、ObservableFromArray

public final class ObservableFromArray<T> extends Observable<T> {
    final T[] array;
    public ObservableFromArray(T[] array) {
        this.array = array;
    }

    @Override
    public void subscribeActual(Observer<? super T> observer) {//MapObserver
        FromArrayDisposable<T> d = new FromArrayDisposable<>(observer, array);
        observer.onSubscribe(d);//BasicFuseableObserver#onSubscribe
        d.run();
    }

    static final class FromArrayDisposable<T> extends BasicQueueDisposable<T> {

        final Observer<? super T> downstream;

        final T[] array;

        FromArrayDisposable(Observer<? super T> actual, T[] array) {
            this.downstream = actual;//MapObserver
            this.array = array;
        }

        void run() {
            T[] a = array;
            int n = a.length;

            for (int i = 0; i < n && !isDisposed(); i++) {
                T value = a[i];
                ...
                downstream.onNext(value);//MapObserver#onNext
            }
            if (!isDisposed()) {
                downstream.onComplete();
            }
        }
    }
}

4、示例

public static void map(){

    Observable.just(12,13)//ObservableFromArray
            .map(new Function<Integer, Object>() {
        // 将基本类型的事件转换为实体类 MapObservable
        @Override
        public Object apply(Integer integer) throws Throwable {
            MapObservable mapObservable = new MapObservable();
            mapObservable.setAge(integer);
            System.out.println("map integer = " + integer);
            return mapObservable;
        }
    }).subscribe(observer);
}

4.1、初始化过程

初始化过程也是Observable类型的中间操作符初始化过程。每级中间操作符的source属性指向其上级中间操作符。

4.2、订阅者过程

订阅者过程也是从后往前执行中间操作符的过程。 通常Observable类型的中间操作符都存在Observer观察者类型的静态内部类。 通过当前操作符的source属性以其对应的Observer观察者作为参数继续调用抽象类Observable的subscribe方法。