java基础--16Optional避免空指针异常

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.使用建议

  1. 尽量避免在程序中直接调用Optional对象的get()和isPresent()方法;
  2. 避免使用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值