手动写一个Rxjava和源码理解(二)数据类型的转换 Map操作符

11 篇文章 0 订阅
2 篇文章 0 订阅

接上一篇手动写一个Rxjava和源码理解(一)事件的发送和订阅

第一篇文章分析了数据的发送和订阅,这一篇我们来分析一下RxJava2是怎么实现数据转换的

第一步,数据转换接口

public interface Function<T,R> {

    R apply(T r);
}

第二步,需要实现一个数据转换被观察者

public class ObservableMap<T, R> extends Observable<R> {


    Function<? super T, ? extends R> function;

    ObservableSource<T> observableSource;


    public ObservableMap(ObservableSource<T> observableSource, Function<? super T, ? extends R> function) {
        this.function = function;
        this.observableSource = observableSource;
    }

    @Override
    protected void subscribeActual(Observer<? super R> observer) {

        MapObserver<T, R> mapObserver = new MapObserver<>(observer, function);
        observableSource.subscribe(mapObserver);
    }


    class MapObserver<T, R> implements Observer<T> {

        Observer<? super R> observer;

        Function<? super T, ? extends R> function;

        public MapObserver(Observer<? super R> observer, Function<? super T, ? extends R> function) {
            this.observer = observer;
            this.function = function;
        }

        @Override
        public void onSubscribe() {

        }

        @Override
        public void onNext(T value) {
            R t = function.apply(value);//数据类型转换的关键不走
            observer.onNext(t);//数据类型转换后,通过观察者的接口传递数据
        }


        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    }
}

第三步,在Observable添加一个数据转换方法

  public final <R> Observable<R> map(Function<? super T, ? extends R> function) {
        return new ObservableMap<T, R>(this, function);
    }

第四步,数据链调用

 Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableCreate.Emitter<Integer> emitter) throws Exception {

                        emitter.next(1);
                        emitter.next(2);
                    }
                }).map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer r) {
                        return r+"";
                    }
                }).subscribeOn(Schedulers.IO)
                        .observerOn(Schedulers.MAIN)
                        .subscribe(new Observer<String>() {
                            @Override
                            public void onSubscribe() {


                                Log.i(TAG, "onSubscribe");
                            }

                            @Override
                            public void onNext(String value) {
                                Log.i(TAG, "onNext:"+value);
                            }

                            @Override
                            public void onError(Throwable e) {
                                Log.i(TAG, "onError");
                            }

                            @Override
                            public void onComplete() {
                                Log.i(TAG, "onComplete");
                            }
                        });

总结:

ObservableMap是Observable的子类
Observable的map方法传入Function接口
MapObserver的onNext实现转换后的数据传递

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值