扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Optional
到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。
成都创新互联是一家集网站建设,铁东企业网站建设,铁东品牌网站建设,网站定制,铁东网站建设报价,网络营销,网络优化,铁东网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
二、Optional类是什么?
Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
三、Optional类用法
如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
如果值不存在则isPresent()方法会返回false,调用get()方法会NPE。
创建Optional类对象的方法:
判断Optional容器中是否包含对象:
boolean isPresent() :判断是否包含对象
void ifPresent(Consumer super T>consumer) :如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它。
获取Optional容器的对象:
T get():如果调用对象包含值,返回该值,否则抛异常
T orElse(T other):如果有值则将其返回,否则返回指定的other对象。
T orElseGet(Supplier extends T>other) :如果有值则将其返回,否则返回由Supplier接口实现提供的对象。
T orElseThrow(Supplier extends X>exceptionSupplier) :如果有值则将其返回,否则抛出由Supplier接口实现提供的异常。
过滤:
-Optional filter(Predicate super predicate) :如果值存在,并且这个值匹配给定的
predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
四、代码示例
@AllArgsConstructor
@NoArgsConstructor
class Student {private String name;
private Integer age;
}
//1、创建Optional类
public void test1() {// 声明一个空Optional
Optional
flatMap代码示例: flatMap跟map是一样的只不过他返回的是optional对象。map实际上就是用的Function函数,Function函数是有两个参数的,第一个是入参数据类型,第二个是返回数据类型。Function函数作用就是传入一个对象,然后返回一个对象,返回的对象类型可以自己设置。
T 就是代表实例的泛型数据类型,就是谁调用的 入参 必须跟调用者泛型的数据类型一样。
U 就是自己说了算,调用完map之后返回什么数据类型,那么U就设置什么
public static OptionalstringToInt(String s) { try { return Optional.of(Integer.parseInt(s));
} catch (NumberFormatException e) { e.printStackTrace();
return Optional.empty();
}
}
Optional.ofNullable(props.getProperty(name))
.flatMap(OptionalUtils::stringToInt)
.filter(i ->i>0)
.orElse(0);
五、什么场景用Optional?
//1、场景一
PatientInfo patientInfo = patientInfoDao.getPatientInfoById(consultOrder.getPatientId());
if (patientInfo != null) {consultInfoResp.setPatientHead(patientInfo.getHead());
}
// 使用Optional 和函数式编程,一行搞定,而且像说话一样
Optional.ofNullable(patientInfo).ifPresent(p ->consultInfoResp.setPatientHead(p.getHead()));
//2、场景二
public void test1() throws Exception {Student student = new Student(null, 3);
if (student == null || isEmpty(student.getName())) {throw new Exception();
}
String name = student.getName();
// 业务省略...
// 使用Optional改造
Optional.ofNullable(student).filter(s ->!isEmpty(s.getName())).orElseThrow(() ->new Exception());
}
public static boolean isEmpty(CharSequence str) {return str == null || str.length() == 0;
}
//3、场景三
public static String getChampionName(Competition comp) throws IllegalArgumentException {if (comp != null) {CompResult result = comp.getResult();
if (result != null) {User champion = result.getChampion();
if (champion != null) {return champion.getName();
}
}
}
throw new IllegalArgumentException("The value of param comp isn't available.");
}
//这个在开发中是很常见的一种逻辑。去判读传进来的参数时候为空,或者是从数据库中获取的对象。由于某些原因,我们不能很流程的直接这样写。
comp.getResult().getChampion().getName()
//上面的写法用Optional改写:
public static String getChampionName(Competition comp) throws IllegalArgumentException {return Optional.ofNullable(comp)
.map(Competition::getResult) // 相当于c ->c.getResult(),下同
.map(CompResult::getChampion)
.map(User::getName)
.orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));
}
4、场景四
//类型之间的转换,并且当没有值的时候返回一个默认值
int timeout = Optional.ofNullable(redisProperties.getTimeout())
.map(x ->Long.valueOf(x.toMillis()).intValue())
.orElse(10000);
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流