目录
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);
});