当前位置: 首页 > news >正文

聊城做手机网站软件开发

聊城做手机网站,软件开发,南充网站建设费用,区块链开发平台有哪些map和flatMap的区别 首先说下map和flatMap的区别&#xff0c;防止有对RxJava还不够熟悉的小伙伴 map的Function指定如何将A转为BflatMap的Function则指定如何将Observable<A>转为Observable<B>map和flatMap最终的转换结果都是Observable<B>flatMap由于可以…

map和flatMap的区别

首先说下map和flatMap的区别,防止有对RxJava还不够熟悉的小伙伴

  • map的Function指定如何将A转为B
  • flatMap的Function则指定如何将Observable<A>转为Observable<B>
  • map和flatMap最终的转换结果都是Observable<B>
  • flatMap由于可以自己创建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 Observable<String> B() {System.out.println("B Execute");return Observable.just("B");}public static Observable<String> C() {System.out.println("C Execute");//throw new RuntimeException("Error");return Observable.just("C");}public static Observable<String> D() {System.out.println("D Execute");return Observable.just("D");}public static Observable<String> 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 Finish

C发生异常时的运行结果

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依次执行onSubscribe
  • ABCDE依次执行Function和onNext
  • ABCDEX依次执行onComplete
  • XEDCBD依次执行onFinally

C发生异常时的生命周期流程

  • ABCDE依次执行onSubscribe
  • AB依次执行Function和onNext
  • C执行Function,但触发Error
  • AB不再执行onComplete,依次执行onFinally
  • C执行onError和onFinally
  • D执行onError和onFinally
  • E执行onError
  • X执行onError
  • E执行onFinally

流程分析

  • 执行subscribe方法之后,B订阅A,C订阅B。。。
  • 无异常时,onFinally是按EDCBD顺序执行的,说明Subscriber工作全部完成后,Observable才会执行onFinally
  • C触发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,再将自己的结果发射给C
  • map方法只是创建了一个起到包装作用的Observable,将所有回调对象,和用于转换的Function保存了起来
  • Function并不会立即执行,而是等subscribe之后,等到上个Observable处理成功,才会执行

subscribe回调和doOn系列回调的区别

  • 效果一样,只是给Observable提供了不同的回调设置方式
  • subscribe回调是设置给最后一个Observable的,和前面代码没有任何关系,不要复杂化
  • 一个Observable可以有多个回调,它们都会生效,并不会相互覆盖,按设置先后顺序执行
http://www.sczhlp.com/news/48780/

相关文章:

  • 建官方网站的公司友情链接出售
  • 手机淘宝客网站怎么做的宁波受欢迎全网seo优化
  • php如何做视频网站谷歌广告代理
  • 电影采集网站怎么做seo深圳百度推广关键词推广
  • 无锡网站建设哪家做项目推广方式有哪些
  • vue 父组件与 iframe 通信
  • 轻量神器!一款可替代 Postman 的 API 调试工具!
  • 做网站怎么建站点seo管理软件
  • 我想建一个做私彩的网站百度空间登录
  • WordPress做大站网站推广软件免费版大全
  • 乐山 网站建设中国2022年重大新闻
  • 网站诊断示例链接交换公司
  • 北京东城区做网站的公司太原搜索引擎优化招聘信息
  • ai模型部署如何安装?手把手教程别错过
  • 网站底部导航栏怎么做阿里云免费建站
  • 淮安做网站的有多少成都seo培训
  • 中堂东莞网站建设百度指数的网址
  • 在微信上做网站石家庄高级seo经理
  • 网站优化标题怎么做做推广怎么做
  • 橙子建站怎么用上海百度推广优化排名
  • 做蛋糕比较火的网站市场监督管理局是干什么的
  • 基于web前端的毕业设计题目求职seo推荐
  • 系统开发过程中的第一个正式文档是重庆网站seo外包
  • wordpress数学公式河南网站seo推广
  • 怎么搭建个人网站电脑做服务器360优化大师app
  • 网站开发就业bt种子磁力搜索引擎
  • 服务器和域名大概需要多少钱seo公司上海
  • 做写字楼的网站有哪些资料网站推广软文范例
  • 百事通做网站百度图片搜索入口
  • 网上商城网站源码如何宣传网站