您的位置:首页 > 房产 > 家装 > Optional避免判空嵌套过多,优雅解决空指针异常

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

2024/12/23 9:37:49 来源:https://blog.csdn.net/qq_44850917/article/details/139996203  浏览:    关键词: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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com