前言
Optional是属于JDK1.8API 新增的,可以优雅解决空指针异常的问题。也可以去除掉重复的if else逻辑问题。
对着旧的代码,修改为使用Optoinal逻辑,有些例子参考网址的,这个只是我作为笔记。
Optional主要方法:
常用方法:ofNullable,of,map,orElse,ofElseThrow。其他自己参考使用,不得不说jdk1.8的api挺好用的。
例子:
public String isCheckNull(User user){
if(null == user){
return "当前值为空"
}
return user.getName;
}
不要使用Optional里面的 isPersent() 去代替掉 null == user ,如果替代掉,那么使用Optional和没使用没区别;
正确写法应该是:
public String isCheckNull(User user){
// 注意点:调用ofNullable,会先去判断当前user是否为空,如果不为空,
// 则调用of方法,如果为空,则调用empty(),实例化一个Optional对象返回。
return Optional.ofNullable(user).map(u -> u.getName).orElse("当前值不存在");
}
这样写,就优雅了很多了嘛。
可以查看ofNullable的源码:
of方法:是实例化一个指定值的Optional对象
接下来看map的方法和解释:
Objects.requireNonNull(mapper); 是直接判断当前对象是否为空,如果为空,直接返回控制值异常。
if(!isPresent()) 是判断当前Options不为空,如果为空,则实例化一个对象,并且返回。因为ofNullable已经实例化一个对象了,所以这里不为空,为true,而!true,则是false,所以不会进入到empty() 方法;
而继续调用Optional.ofNullable(mapper.apply(value));则是再次实例化对象里面的值。就是user里面,当name不为空的时候,再实例化一个值为 name的Optional,继续操作你所需要的下一步。
因此,我们可以使用map 链式调用。或者说是链式判断比较好。
如:我现在有一个需求,一个用户有多个角色,我需要当角色是管理员的时候,再去判断管理员有哪些权限。
如果照正常逻辑来做
public String isCheckUser(User user){
if(null != user){
// 获取角色
if(null != user.getRole()){
// 获取管理员权限
if(null != user.getRole().getPermission()){
return "获取管理员权限";
}
}
}else{
return "用户为空";
}
}
但是如果按照Optional来做的话:
public String isCheckUser(User user){
return Optional.ofNullable(user)
.map(u -> u.getRole)
.map(p -> p.getPermission())
.orElse("用户为空");
}
目的都一样,但是这样写起来的代码很优雅。
还有一个orElaseThrow(),如果达到条件则抛出想要的异常。
具体就多看API多使用咯。还有一个Filter方法。
参考网址:
http://www.importnew.com/26066.html(Java8 如何正确使用 Optional)
http://www.importnew.com/22060.html(使用 Java8 Optional 的正确姿势)
https://blog.csdn.net/zhang89xiao/article/details/76596046(优雅的使用optional)
Lambda表达式
通过使用() -> {}代码块来达到代码简化易读。
举个例子,老版本排序是这样子的,需要实现匿名函数
List<Integer> sorts = Arrays.asList(11, 9, 14, 35, 8);
Collections.sort(sorts, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
System.out.println(sorts.toString());
/**
结果:[8, 9, 11, 14, 35]
*/
使用Lambda表达式
List<Integer> strs = Arrays.asList(11, 9, 14, 35, 8);
Collections.sort(strs, (a, b) -> a.compareTo(b));
System.out.println(strs.toString());
Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。
这还不是最简化的,还能够
List<Integer> strs = Arrays.asList(11, 9, 14, 35, 8);
strs.sort(Integer::compareTo);
System.out.println(strs.toString());
结果同样。