Optional避免判空嵌套过多,优雅解决空指针异常

背景

最近在处理json文件反序列化为实体类的时候,抛出空指针异常,发现很多地方没有判空逻辑。
增加判空逻辑后,嵌套太多导致代码很臃肿,因此学习用Optional来进行优化代码,增加可读性。

Optional使用场景

1. map自动忽略空值,用于处理需要多次嵌套判空的场景

    // 需求1:获取某个产品的所有用户年龄。
    
    Product product = new Product();
    List<Integer> ages = new ArrayList<>();
// 原来的写法很冗余,不断地嵌套
//    List<User> users = product.getUsers();
//    if (!CollectionUtils.isEmpty(users)){
//      User user = users.get(0);
//      if (!Objects.isNull(user)){
//        Integer age = user.getAge();
//        if (age != null){
//          ages.add(age);
//        }
//      }
//    }
//    System.out.println(ages.toString());
//更优雅的写法
    Optional.ofNullable(product)
        .map(a -> a.getUsers())
        .map(a -> a.get(0))
        .map(a -> a.getAge())
        .ifPresent(e->ages.add(e));

    System.out.println(ages.toString());
    

2.filter满足条件返回值,否则返回Optinal

    // 需求2:如果产品的版本包含1.0返回1.0,否则返回"高版本"。
    Product product = new Product(Arrays.asList(new User("zhangsan", 1)), "1.0");
    Optional<Product> product1 = Optional.ofNullable(product)
        .filter(pro -> pro.getVersion() != null && pro.getVersion().contains("1.0"));// 满足条件后会返回第一个操作对象
    String s = product1.map(p -> p.getVersion())
        .orElse("高版本");//如果为空,或者不包含1.0返回"高版本"
    System.out.println(s);

总结

常用api

Optinal.ofNullable(Object)//新建optional对象
product1.map()//获取optional对象值,空值也不会报错
product1.filter()// 条件过滤,满足返回Optional对象,否则返回Optional<null>
orElse()//map中如果为空,直接跳到这一步返回默认值。经过这一步后都会将Optional包装的值取出来返回

参考文献

https://blog.csdn.net/weixin_42048560/article/details/86765903
https://blog.csdn.net/qq_43631716/article/details/107192503
https://blog.csdn.net/qq_35634181/article/details/101109300

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值