背景
最近在处理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