Java解决if(!=null)臭名昭著的判空处理(Optional)
原文链接:Java解决if(!=null)臭名昭著的判空处理(Optional)
话不多说,我们先来看一下下面这个代码:
/** * 场景一: * 获得实体对象的某个值 */ private String getDemoEntityDeName1(DemoEntity demoEntity) { if (demoEntity != null) { DemoEntitySon demoEntitySon = demoEntity.getDemoEntitySon(); if (demoEntitySon != null) { String strName = demoEntitySon.getDeName(); if (strName != null) { return strName; } } } return null; }
12345678910111213141516我们可以看见,为了获得,一个name,必须要进行多次空判断,否则,就存在空异常!!!
那么如何改进呢?
jdk1.8提出了Optional方法用来解决此方法:
依然是上述代码,改如何改进?
//改进写法 private String getDemoEntityDeName2(DemoEntity demoEntity) { return Optional.ofNullable(demoEntity) .map(DemoEntity::getDemoEntitySon) .map(DemoEntitySon::getDeName).orElse(null); } 123456
接着看场景二:
/** * 场景二: * 判断对象或者字符是否为空,为空返回false,非空true */ private boolean getBoType1() { String type = null; if (type == null) { return false; } else { return true; } } 123456789101112
我们为了获得判断是否为null,进行这样写?一点也不美观,如果代码多了,可读性极差。。。
//改进写法 private boolean getBoType2() { String type = null; return Optional.ofNullable(type).isPresent(); /** * 源码: * public boolean isPresent() { * return value != null; * } */ } 1234567891011
现在代码看起来比之前采用条件分支的冗长代码简洁多了。
以下扒一下,两个方法的源码,看起来也不难。
//of方法源码 private void testOf() { //这里一定会抛出异常 DemoEntity demoEntity = null; Optional.of(demoEntity); /** 源码:为null直接抛空指针异常 * public static <T> T requireNonNull(T obj) { * if (obj == null) * throw new NullPointerException(); * return obj; * } */ } //OfNullable源码 private void testOfNullable() { DemoEntity demoEntity = null; Optional.ofNullable(demoEntity).orElse(null); /** 源码:直接判空和of判断 * public static <T> Optional<T> ofNullable(T value) { * return value == null ? empty() : of(value); * } */ }
123456789101112131415161718192021222324用法如上,原理用法请直接扒源码,很简单看懂。
网址:Java解决if(!=null)臭名昭著的判空处理(Optional) https://www.yuejiaxmz.com/news/view/35871
相关内容
基于java+ssm+jsp的个人财务管理系统基于java web个人财务管理系统
基于Java个人财务管理系统设计实现(源码+lw+部署文档+讲解等)
基于Java+SpringBoot+Vue+HTML5膳食营养健康网站(源码+LW+调试文档+讲解等)/膳食搭配/营养建议/健康生活/网站推荐/营养学/饮食指南/健康饮食/营养食谱/膳食计划/健康膳食
基于Android的个人财务管理系统的设计与实现.
基于python的膳食健康推荐系统
基于微信小程序的美食菜谱交流平台(附源码)
【开源】基于SpringBoot的衣物搭配系统的设计和实现
C语言个人财务管理示例
MATLAB图像处理(包括图像类型转换)