Rxjava2中Single的map操作符源码学习

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操作符的执行流程。

你可能感兴趣的:(Android)