RxJava 2.x 源码分析(三) 变换操作符map和flatMap

本文深入探讨RxJava 2.x中map和flatMap操作符的实现原理。map通过Function接口将上游的整型数据转换为String,而flatMap则在接收到每个上游数据时生成新的可观察者,实现更复杂的变换功能。这两个操作符都是通过创建新的观察者来处理和传递数据,遵循RxJava框架的基本执行流程。
摘要由CSDN通过智能技术生成

RxJava的操作符有很多,一般常用的有变换操作符,其中最主要是map和flatMap,本文将分别来讲解一下它们的实现原理。在上一篇文章:RxJava 2.x 源码分析(二) 线程切换原理中,讲到RxJava框架的执行流程,理解这个对我们源码的阅读是有很大帮助的,所以如果你还不懂的话,请移步到上一篇文章去读一下

 

一:map的实现原理

老规矩,先上一个例子:

 Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(4);
            }
        }).map(new Function<Integer, String>() {
            @Override
            public String apply(@NonNull Integer integer) throws Exception {
                return "This is result " + integer;
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(@NonNull String s) throws Exception {
                mRxOperatorsText.append("accept : " + s +"\n");
                Log.d(TAG, "accept : " + s +"\n" );
            }
        });

输出结果:

在例子中,map函数通过参数Function的接口方法apply,将Observable发射的整型数据转换成了String字符串,这就是map的变换功能了,它可以将收到的上游数据,根据自己的需要作相关处理,再将数据传递给下游

切入到map的源码看看

    public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
        ObjectHelper.requireNonNull(mapper, "mapper is null");
        return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
    }

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

    @Override
    public void subscribeActual(Observer<? super U> t) {
        source.subscribe(new MapObserver<T, U>(t, function));
    }

函数返回一个ObservableMap实例,这是一个新的可观察者,关注它的subscribeActual方法,可以看到生成一个新的观察者MapObserver,这就是负责变换数据的观察者了,其中传递的第一个参数为下一级观察者,第二个参数m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值