https://mp.weixin.qq.com/s/SX1puW0KSuCcwi4MI5jLGg
1.Optional
在JAVA8中引入了一个新的类Optional,用于专门解决非空判断这个问题,先举一个之间如何防止空指针异常而多次的对对象进行非空判断.
public static String getInsuranceDeepName(Person person){
if(person!=null){
Car car = person.getCar();
if(car!=null){
Insurance insurance = car.getInsurance();
if(insurance!=null){
return insurance.getName();
}
}
}
return "unknow";
}
Optional核心api
创建一个Optional值有三种方式
Optional.of()
Optional.ofNullable() 如果值为空,上面会抛出一个NPE异常,而这个方法会产生一个空的Optional
Optional.empty()
Optional的使用策略
如果没有任何匹配的时候我们希望可能有这样的操作,返回一个空字符串,调用代码来计算默认值,抛出异常
orElse()
orElseGet()
orElseThrow()
map() 如果想要处理函数的结果,应当使用map函数来作映射处理,这个map方法和Stream中的map方法类似
flatMap():返回多个Optional对象的时候如何调用呢,例如有下面的方法,我要对一个数先求倒数,再开平方根。flatMap()再Stream中是摊平一个流构成的流,在这里又何尝不是呢。
1.empty() 方法用于创建一个没有值的Optional对象:
Optional<User> emptyOpt = Optional.empty();
emptyOpt.get();
他会报:
2.of() 方法使用一个非空的值创建Optional对象,如果为null的话会报空指针异常,所以一般我们不用,ofNullable() 方法接收一个可以为null的值。
3. 判断 Null:isPresent()
4. 使用map提取对象的值
5.使用orElse方法设置默认值
orElse():如果有值就返回,否则返回一个给定的值作为默认值;
orElseGet():与orElse()方法作用类似,区别在于生成默认值的方式不同。该方法接受一个Supplier<? extends T>函数式接口参数,用于生成默认值;
orElseThrow():与前面介绍的get()方法类似,当值为null时调用这两个方法都会抛出NullPointerException异常,区别在于该方法可以指定抛出的异常类型。
6.使用filter()方法过滤
7.使用建议
- 尽量避免在程序中直接调用Optional对象的get()和isPresent()方法;
- 避免使用Optional类型声明实体类的属性;
8.简化if-else
User user = ...
if (user != null) {
String userName = user.getUserName();
if (userName != null) {
return userName.toUpperCase();
} else {
return null;
}
} else {
return null;
}
User user = ...
Optional<User> userOpt = Optional.ofNullable(user);
return user.map(User::getUserName)
.map(String::toUpperCase)
.orElse(null);
参考博客:
https://blog.csdn.net/weixin_42048560/article/details/86765903