RxJava3源码实现-2-map操作符+解析数据流实现

目录

1、介绍

2、map()

3、subscribe()

4、总结(数据流实现)


1、介绍

RxJava3手写实现-1-create()+subscribe()

已经对我们的create()和subscribe()函数进行了实现讲解,这里就不做介绍了。

手写实现的源码地址

map()函数的作用:就是将我们输入的数据类型进行转换。可以将Integer类型转换成String类型,也可以在原数据类型上进行值的修改。

2、map()

1、map()函数中会new一个YoFunction的类对象,它其中有一个apply()函数,在这里进行类型转换,但是目前还没执行。

2、这个YoFunction对象和前面create()函数返回的YoObservable对象会被传给YoObservableCreate类中。

注1:我们的map()函数也会返回一个YoObservable对象,如果你只订阅create创建的那个YoObservable对象的话,是不会有类型转换的操作的。它们互相独立。

注2:从这里我们看到,RxJava为什么叫做反应式编程,这是因为你只要不订阅它(调用suscribe()方法),是不会有实际的操作的。

3、subscribe()

看下图:

1、当我们订阅Observer的时候,会调用ObservableMap中的subscribeActual()方法,在这个方法中,重新new了一个MapObservable(Observer的实现类),然后继续订阅用这个MapObservable对象去往上订阅create()函数的Observable对象。

2、这时候就会触发下图2的调用流程;

3、当下图2的流程进行完毕之后,就会回到我们下图1的第四步,然后调用apply()函数,进行数据类型转换。

4、最后一步就是将数据输出出来了。

                                                                                                        图一

                                                                                                        图二

4、总结

通过map()方法的实现,你会发现,RxJava是怎样通过数据流的方式处理数据的。

其实代码很简单,看下面的代码:

1、它会从subscribe()开始,首先它会触发take()方法返回的Observable对象O1的subscribe()方法;

2、O1对象的subscribe()会触发filter()方法返回的Observable对象的O2的subscribe()方法,并会新new 出来一个Observer的实现类TakeObserver对象,然后用TakeObserver去订阅O2

3、O2对象的subscribe()会触发map()方法返回的Observable对象的O3的subscribe()方法,并会新new 出来一个Observer的实现类FilterObserver对象,然后用FilterObserver去订阅O3

4、O3对象的subscribe()会触发create()方法返回的Observable对象的O4的subscribe()方法,并会新new 出来一个Observer的实现类MapObserver对象,然后用MapObserver去订阅O4

5、这样从Create的onNext()开始,会先调用MapObserver的onNext()方法,然后会调用FilterObserver的onNext()方法,然后调用TakeObserver的onNext()方法,最后调用自己new出来的那个Observer的onNext()方法。

 Observable.<Integer>create(s -> {
            s.onNext(1);
            s.onNext(2);
            s.onNext(3);
            s.onComplete();
        }).map(s->s+1)
          .filter(s->s>10)
          .take(3)
          .subscribe(s->{
              System.out.println(s);
          });

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创文章 120 获赞 34 访问量 28万+

猜你喜欢

转载自blog.csdn.net/qq_34589749/article/details/105439641
今日推荐