使用JDK1.8 特性 Optional,优雅解决NullPointException

前言

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());

结果同样。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值