专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

求求你,不要再使用!null判空了

  对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。
  那么,有什么办法可以避免在代码中写大量的判空语句呢?
  有人说可以使用JDK8提供的Optional来避免判空,但是用起来还是有些麻烦。
  作者在日常工作中,封装了一个工具,可以可以链式调用对象成员而无需判空,相比原有的ifnull逻辑和JDK8提供的Optional更加优雅易用,在工程实践中大大提高了编码效率,也让代码更加的精准和优雅。
  不优雅的判空调用
  我想从事Java开发的小伙伴肯定有遇到过下面这种让人难受的判空逻辑:现在有一个User类,School是它的成员变量authorAxinsince20200920summary一个User类定义(Ps:Data是lombok组件提供的注解,简化了getset等等的约定代码)DatapublicclassUser{privateStringname;privateStringgender;privateSchoolschool;DatapublicstaticclassSchool{privateStringscName;privateStringadress;}}复制代码
  现在想要获得School的成员变量adress,一般的处理方式:publicstaticvoidmain(String〔〕args){UseraxinnewUser();User。SchoolschoolnewUser。School();axin。setName(hello);if(Objects。nonNull(axin)Objects。nonNull(axin。getSchool())){User。SchooluserScaxin。getSchool();System。out。println(userSc。getAdress());}}复制代码
  获取adress时要对School进行判空,虽然有些麻烦,到也能用,通过JDK8提供的Optional工具也是可以,但还是有些麻烦。
  而下文的OptionalBean提供一种可以链式不断地调用成员变量而无需判空的方法,直接链式调用到你想要获取的目标变量,而无需担心空指针的问题。
  链式调用成员变量
  如果用了本文设计的工具OptionalBean,那么上述的调用可以简化成这样:publicstaticvoidmain(String〔〕args){UseraxinnewUser();User。SchoolschoolnewUser。School();axin。setName(hello);1。基本调用Stringvalue1OptionalBean。ofNullable(axin)。getBean(User::getSchool)。getBean(User。School::getAdress)。get();System。out。println(value1);}复制代码
  执行结果:
  其中User的school变量为空,可以看到代码并没有空指针,而是返回了null。这个工具怎么实现的呢?
  OptionalBean工具authorAxinsince20200910summary链式调用bean中value的方法publicfinalclassOptionalBeanT{privatestaticfinalOptionalBeanlt;?EMPTYnewOptionalBean();privatefinalTvalue;privateOptionalBean(){this。valuenull;}空值会抛出空指针paramvalueprivateOptionalBean(Tvalue){this。valueObjects。requireNonNull(value);}包装一个不能为空的beanparamvalueparamTreturnpublicstaticTOptionalBeanTof(Tvalue){returnnewOptionalBean(value);}包装一个可能为空的beanparamvalueparamTreturnpublicstaticTOptionalBeanTofNullable(Tvalue){returnvaluenull?empty():of(value);}取出具体的值paramfnparamRreturnpublicTget(){returnObjects。isNull(value)?null:value;}取出一个可能为空的对象paramfnparamRreturnpublicROptionalBeanRgetBean(Functionlt;?superT,?extendsRfn){returnObjects。isNull(value)?OptionalBean。empty():OptionalBean。ofNullable(fn。apply(value));}如果目标值为空获取一个默认值paramotherreturnpublicTorElse(Tother){returnvalue!null?value:other;}如果目标值为空通过lambda表达式获取一个值paramotherreturnpublicTorElseGet(Supplierlt;?extendsTother){returnvalue!null?value:other。get();}如果目标值为空抛出一个异常paramexceptionSupplierparamXreturnthrowsXpublicXextendsThrowableTorElseThrow(Supplierlt;?extendsXexceptionSupplier)throwsX{if(value!null){returnvalue;}else{throwexceptionSupplier。get();}}publicbooleanisPresent(){returnvalue!null;}publicvoidifPresent(Consumerlt;?superTconsumer){if(value!null)consumer。accept(value);}OverridepublicinthashCode(){returnObjects。hashCode(value);}空值常量paramTreturnpublicstaticTOptionalBeanTempty(){SuppressWarnings(unchecked)OptionalBeanTnone(OptionalBeanT)EMPTY;returnnone;}}复制代码
  工具设计主要参考了Optional的实现,再加上对链式调用的扩展就是上述的OptionalBean。
  getBean其实是当变量为空时返回了一个包装空值的OptionalBean对象,同时泛型的使用让工具更加易用。
  使用手册
  可以看到代码中也提供了和Optional一样的扩展方法,如ifPresent()、orElse()等等:publicstaticvoidmain(String〔〕args){UseraxinnewUser();User。SchoolschoolnewUser。School();axin。setName(hello);1。基本调用Stringvalue1OptionalBean。ofNullable(axin)。getBean(User::getSchool)。getBean(User。School::getAdress)。get();System。out。println(value1);2。扩展的isPresent方法用法与Optional一样booleanpresentOptionalBean。ofNullable(axin)。getBean(User::getSchool)。getBean(User。School::getAdress)。isPresent();System。out。println(present);3。扩展的ifPresent方法OptionalBean。ofNullable(axin)。getBean(User::getSchool)。getBean(User。School::getAdress)。ifPresent(adressSystem。out。println(String。format(地址存在:s,adress)));4。扩展的orElseStringvalue2OptionalBean。ofNullable(axin)。getBean(User::getSchool)。getBean(User。School::getAdress)。orElse(家里蹲);System。out。println(value2);5。扩展的orElseThrowtry{Stringvalue3OptionalBean。ofNullable(axin)。getBean(User::getSchool)。getBean(User。School::getAdress)。orElseThrow(()newRuntimeException(空指针了));}catch(Exceptione){System。out。println(e。getMessage());}}复制代码
  run一下:
  总结
  设计了一种可以链式调用对象成员而无需判空的工具让代码更加的精准和优雅,如果本文设计的工具满足了刚好解决你的困扰,那就在项目中使用吧!

一边倒!奥尼尔与大梦谁更强?美媒全面对比,52,结果一目了然同为历史级别的超级中锋,奥拉朱旺与奥尼尔都拥有完美的职业生涯,不仅多次赢得总冠军,同时拿到过MVP与FMVP等核心硬荣誉。其中奥尼尔是公认的历史最具统治力内线球员,凭借夸张的个人能一件老汉背心八千,一个垃圾袋1。2万,大牌专坑有钱人?最近,奢侈品又开始从平常老百姓的生活汲取灵感,打造出还原度百分之百的时尚单品,只是价格却相差十万八千里。一件老汉背心8000元,一个垃圾袋12000元。网友纷纷表示这是劫富济贫,专别不信,90年代的女性比现在的人还潮,穿搭大气自信很洋气穿搭这件事情,看似和个人魅力并无直接关系,但却也真真切切地影响着我们的仪表体态。提起90年代,想必很多人的脑海中就出现了群星璀璨的港坛,当年的港风穿搭,不仅适合明星,更对普通人的个热议昔日C罗接班人,皇马1个亿买他打水漂!北京时间8月11日凌晨结束的欧洲超级杯中,皇马2球完胜法兰克福捧起冠军奖杯。赛后,皇马球迷展开社交媒体狂欢,一方面是众口一词地认为,可以提前给本泽马颁发众望所归的年度金球奖了。二来新一轮通胀要来了,老百姓如何应对?专家建议4件事情最好不做新一轮通胀要来了,老百姓如何应对?专家建议4件事情最好不做!受国际局势不稳定疫情反反复复的影响,世界经济增速下滑,美联储为了转嫁经济影响,通过加大货币发行量进行转嫁,这两年先后释放房地产的大麻烦来了房地产的大麻烦来了!(一)才刚入秋,房地产的大麻烦来了。近期,交通银行就提前还贷需要额外支付补偿金的公告在网上引起了很大的讨论。基于舆论压力,这条公告仅在官网发布了一天,就删除了。网购平台找不到侵权者,可以向平台追责吗?A公司负责人在朋友圈看到一条团购链接,里面的商品居然偷偷使用了他们拥有著作权的作品,气不打一处来的负责人想要找这个商家评评理,但通过网购平台却拿不到商家的身份联系方式,维权无门的A投啥亏啥,负债超过4亿!难怪贝克汉姆着急让儿子倒插门贝克汉姆的儿子倒插门果然有隐情!维多利亚被曝负债4亿每日邮报最新消息显示,维多利亚贝克汉姆名下的高端时装公司,负债金额高达5390万英镑(约合人民币4。4亿)!维多利亚2008年推那些网易云治愈伤感文案1。那日桥边,惊鸿一瞥,再至桥边,无处有你,无一不是你。网易云热评隔岸2。今日的事今日翻篇,明天还要忙着可爱。网易云热评晴天3。习习凉风,阵阵心动伊人朦脓,伴入月中。网易云热评Ne坦克世界奉上多重大礼,全球12周年纪念庆祝活动等你参加坦克世界无论在国内还是全球都深受军迷玩家的欢迎,如今游戏在8月迎来了12岁生日,在这个值得庆贺的日子到来之时,官方也准备了活动,让全球玩家都能共度欢庆,拿到丰厚大奖。820国服庆典启动股市还是楼市,稍显纠结,大概率让股市重回15年前的高点让经济实现更好的正循环,究竟是启动股市还是楼市,请各位密切跟进,现在正在思考,稍稍有那么一点点纠结。央行公布金融数据,让大家看到了一个都不愿意看到的循环。M2的高增长并没有和社融完
三江源国家公园自然守护者吐旦辞去铁路工作,在生命禁区守护家乡长江源2022年6月29日,晨曦中,跨过沱沱河的青藏铁路列车红星新闻记者蔡晓仪王震华摄影记者陶轲王红强发自青海格尔木编辑官莉潘莉自上世纪五十年代青藏公路通车起,唐古拉山镇所在的沱沱河地区北京率先给予无人接驳车路权获编码车辆可合规上路11月7日,北京市高级别自动驾驶示范区工作办公室发布了全国首个针对不配备驾驶位和方向盘的短途载客类智能网联新产品的规范性文件北京市智能网联汽车政策先行区无人接驳车管理细则(道路测试13代i7对比12代i5跑程序快了多少附带双十一生产力设备合集推荐大家好,我是Circaboy,近期接连入了一堆设备,特此过来盘点一下生产力设备的选购。我的背景呢程序员设计师,所以在电子设备部分我的要求非常高,挑了一圈之后,我也交了不少学费,总算H3CBookUltra14T初生牛犊,凭何不怕虎?聊到商用轻薄本,相信大家都有各自的认知和认定。这个自笔记本诞生以来就在不断进化的细分品类,发展到现在,似乎已经难有立锥之地。因此,当我们接触到新华三集团推出的这款H3CBookUl购买InfortrendNVMeU。2全闪机型,免费获取软件许可InfortrendNVMeU。2全闪存解决方案,使得数据在企业的运营中发挥了巨大的作用。Infortrend普安科技GSU。2旗舰级全闪存搭载最新的IntelXeon处理器,采用麒麟v10系列单用户模式起因因为操作系统有关键性文件被删除了,导致系统出现了问题,需要进行修复系统,这个时候只能进去单用户模式去修复,然后我安装centos系的方法重启按e,没想到需要输入账号密码,我输入雷神TBook14轻薄本测评i9标压32G,办公天花板?轻薄本i9,办公天花板?众所周知,轻薄本和性能不可兼得,如果要兼得,自然价格不会太亲民,尤其是搭载了i9这样顶级处理器的笔记本,万元级别是它的常态。如果你要问同事,她需要台什么样的如何确定电脑主板是否坏了?最简单的,目测,如果主板上的元件烧焦了,就是了。接下来再看显卡插槽,出于加强插槽机械强度以及增强屏蔽电磁干扰的能力,厂商在插槽外围增加了金属护甲,因此很难从插槽的外观判断是否运用过2022年取暖器怎样选?4款热门取暖器横测(图文)最近一段时间,因为某些原因,中国的取暖设备在欧洲大受欢迎,迎来了备货高峰期。北方大部分家庭冬天都会通暖气,所以对电暖气这类产品并不怎么感冒。但对基本不通暖气的南方家庭来说,是他们不超能世界挂机机制分析白嫖VIP本文首发超能攻略组,未经授权禁止抄袭文章转载至其它平台。各位小伙伴们大家好,我是筱筱。今天给大家带来一期挂机机制的分析。挂机机制1挂机会根据我们的冒险进度来产出收益,冒险进度越高收西安高新区庞光街道荣获陕西省第二批公共文化服务高质量发展示范镇日前,陕西省文化和旅游厅发布第二批35个陕西省公共文化服务高质量发展示范乡镇(街道)名单,西安高新区庞光街道榜上有名。庞光街道地处西安高新区东南,总面积35平方公里。其境内文化遗存
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网