青岛地产网站建设,广州网站建设小程序开发,wordpress4.7.2写文章,企业推广方式有哪些map和flatMap的区别
首先说下map和flatMap的区别#xff0c;防止有对RxJava还不够熟悉的小伙伴
map的Function指定如何将A转为BflatMap的Function则指定如何将ObservableA转为ObservableBmap和flatMap最终的转换结果都是ObservableBflatMap由于可以…map和flatMap的区别
首先说下map和flatMap的区别防止有对RxJava还不够熟悉的小伙伴
map的Function指定如何将A转为BflatMap的Function则指定如何将ObservableA转为ObservableBmap和flatMap最终的转换结果都是ObservableBflatMap由于可以自己创建Observable因此更为强大灵活map比较简单
Observable生命周期测试
下面我们创建一个Observable并通过map和flatMap进行多次Observable转换
分别在正常流程和异常流程下测试map过程中各个Observable的生命周期执行流程
import io.reactivex.rxjava3.core.Observable;SuppressWarnings(all)public class RxJavaMapTest {public static class Action {public static String A() {System.out.println(A Execute);return A;}public static ObservableString B() {System.out.println(B Execute);return Observable.just(B);}public static ObservableString C() {System.out.println(C Execute);//throw new RuntimeException(Error);return Observable.just(C);}public static ObservableString D() {System.out.println(D Execute);return Observable.just(D);}public static ObservableString E() {System.out.println(E Execute);return Observable.just(E);}}public static void main(String[] args) {Observable.just().map(o - Action.A()).doOnSubscribe(aAction - {System.out.println(doOnSubscribe A);}).doOnNext(o - {System.out.println(doOnNext A1);}).doOnNext(o - {System.out.println(doOnNext A2);}).doOnError(e - {System.out.println(doOnError A);}).doOnComplete(() - {System.out.println(doOnComplete A);}).doFinally(() - {System.out.println(doOnFinally A);}).flatMap(o - Action.B()).doOnSubscribe(aAction - {System.out.println(doOnSubscribe B);}).doOnNext(o - {System.out.println(doOnNext B);}).doOnError(e - {System.out.println(doOnError B);}).doOnComplete(() - {System.out.println(doOnComplete B);}).doFinally(() - {System.out.println(doOnFinally B);}).flatMap(o - Action.C()).doOnSubscribe(o - {System.out.println(doOnSubscribe C);}).doOnNext(o - {System.out.println(doOnNext C);}).doOnError(e - {System.out.println(doOnError C);}).doOnComplete(() - {System.out.println(doOnComplete C);}).doFinally(() - {System.out.println(doOnFinally C);}).flatMap(o - Action.D()).doOnSubscribe(o - {System.out.println(doOnSubscribe D);}).doOnNext(o - {System.out.println(doOnNext D);}).doOnError(e - {System.out.println(doOnError D);}).doOnComplete(() - {System.out.println(doOnComplete D);}).doFinally(() - {System.out.println(doOnFinally D);}).flatMap(o - Action.E()).doOnSubscribe(o - {System.out.println(doOnSubscribe E);}).doOnNext(o - {System.out.println(doOnNext E);}).doOnError(e - {System.out.println(doOnError E);}).doOnComplete(() - {System.out.println(doOnComplete E);}).doFinally(() - {System.out.println(doOnFinally E);}).subscribe(o - System.out.println(doOnFinally X),e - System.out.println(doOnError X),() - System.out.println(doOnFinally X));System.out.println(Task Finish);}}
正常情况下的运行结果
doOnSubscribe A
doOnSubscribe B
doOnSubscribe C
doOnSubscribe D
doOnSubscribe E
A Execute
doOnNext A1
doOnNext A2
B Execute
doOnNext B
C Execute
doOnNext C
D Execute
doOnNext D
E Execute
doOnNext E
doOnFinally X
doOnComplete A
doOnComplete B
doOnComplete C
doOnComplete D
doOnComplete E
doOnFinally X
doOnFinally E
doOnFinally D
doOnFinally C
doOnFinally B
doOnFinally A
Task FinishC发生异常时的运行结果
doOnSubscribe A
doOnSubscribe B
doOnSubscribe C
doOnSubscribe D
doOnSubscribe E
A Execute
doOnNext A1
doOnNext A2
B Execute
doOnNext B
C Execute
doOnFinally A
doOnFinally B
doOnError C
doOnFinally C
doOnError D
doOnFinally D
doOnError E
doOnError X
doOnFinally E
Task Finish下面我们基于以上两次运行结果进行分析
如果有其它更深层次的疑问可以复制以上代码自己调整继续运行
正常流程下的生命周期流程
ABCDEX依次执行onSubscribeABCDE依次执行Function和onNextABCDEX依次执行onCompleteXEDCBD依次执行onFinally
C发生异常时的生命周期流程
ABCDE依次执行onSubscribeAB依次执行Function和onNextC执行Function但触发ErrorAB不再执行onComplete依次执行onFinallyC执行onError和onFinallyD执行onError和onFinallyE执行onErrorX执行onErrorE执行onFinally
流程分析
执行subscribe方法之后B订阅AC订阅B。。。无异常时onFinally是按EDCBD顺序执行的说明Subscriber工作全部完成后Observable才会执行onFinallyC触发Error后AB都不执行onComplete说明Subscriber处理时发生错误Observable也会被视为工作未完成C触发Error后AB立刻执行onFinally说明Subscriber发生异常时Observable工作直接结束C触发Error后AB不执行onError但DE会执行onError说明Observable错误会引发Subscriber错误
多次map过程中异常处理方式可以总结为
发生异常时所有的OnSubscribe都会执行发生异常时所有的OnFinally都会执行发生异常时所有的OnComplete都不会执行发生异常时后续的OnError都会执行发生异常时后续的OnNext都不会执行发生异常时后续的Function都不会执行
多次map过程中Function的处理方式
多次map实际上是依次订阅的关系B订阅A再将自己的结果发射给Cmap方法只是创建了一个起到包装作用的Observable将所有回调对象和用于转换的Function保存了起来Function并不会立即执行而是等subscribe之后等到上个Observable处理成功才会执行
subscribe回调和doOn系列回调的区别
效果一样只是给Observable提供了不同的回调设置方式subscribe回调是设置给最后一个Observable的和前面代码没有任何关系不要复杂化一个Observable可以有多个回调它们都会生效并不会相互覆盖按设置先后顺序执行