前言
在JAVA开发中,空指针是程序员遇到的最多的异常之一(特别是刚接触java开发的),对于对象中的某个属性,有时候我们为了避免程序报空指针错误,而不得不使用较多的if、else来进行逻辑判断,但这样的话代码可能就会比较冗余或者说不够优雅 。虽然我们大部分程序员是有责任心的,不会坐视不管,于是就有了大量的 null 值检查 。尽管有时候这种检查完全没有必要 , 但我们已经习惯了例行公事 。终于Java 8 看不下去了 , 就引入了 Optional,以便我们编写的代码不再那么呆板 。NPE问题NPE问题就是我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示:
文章插图
现在需要访问用户地址信息的省份,简单代码为:user.getAddress().getProvince();
在这种写法中 , 当user为null时,是有可能报NPE异常的 。为了解决这个问题,于是采用下面的写法:
public String OptGetProvince(User user){if(user!=null){Address address = user.getAddress();if(address!=null){String province = address.getProvince();return province;}return "none";}}
这种写法是比较繁琐的,为了避免上述丑陋的写法 。于是JAVA8提供了Optional类来优化这种写法:public String OptGetProvince(User user){return Optional.ofNullable(user).map(s -> s.getAddress()).map(a -> a.getProvince()).orElse("none");}
可以看到,通过Optional的使用,可以很好的解决if以及嵌套判空的问题,使得整体的判断变得清爽简洁多了 。Optional使用我们可以把Optional类看成是一个容器,我们将对象存储到容器中后,通过调用内置的API,可以较为安全地过滤掉可能存在的空指针问题,避免繁琐嵌套的if、else操作,让我们的代码尽可能的简洁 。API主要分5个大类 。
文章插图
构造函数: empty,of,ofNullableempty返回一个空的Optional对象 。
Optional.empty();
of根据传入的值生成Optional对象 。// 方式2 将非空对象作为属性传入Optional类中User u = new User("小明",16); Optional.of(u.getAddress());
ofNullable 和of方法一样,根据传入的值生成optional对象 。// 方式3 将非空对象作为属性传入Optional类中 User u = new User("小明",16); Optional.ofNullable(u.getAddress());
of和ofNullable的作用很相近,从Optional类的源代码看的话,可以发现对于ofNullable方法的话是有进行判空的 。也就是说,如果使用of方法传入的参数是null,同样会报空指针 。文章插图
值选择方法:orElse , orElseGet和orElseThrow这三个方法相当于SQL中的IFNULL函数,若Optional中值为null,则返回给定的默认值 。
orElse
User s = new User("小明",16,new Address());String result = Optional.ofNullable(s.getAddress().getProvince()).orElse("深圳");
orElseGetUser s = new User("小明",16,new Address());String result = Optional.ofNullable(s.getAddress().getProvince()).orElseGet(()->"深圳");
orElseThrowUser s = new User("小明",16,new Address());String s3 = Optional.ofNullable(s.getAddress().getProvince()).orElseThrow(() -> new IllegalArgumentException("缺少参数"));
对于orElseThrow和orElseGet两个方法 , 是采用函数式接口的方式来作为参数的 。同时,对于orElse和orElseGet两个方法,作用相近 , 区别是若Optional对象中的值不为空,则orElseGet不会创建参数中的对象 , 而orElse无论什么情况都会创建参数对象 。判空函数:isPresent和ifPresent两个函数的用法类似,都可以用作判空 , 区别在于当不为空时 , ifPresent会执行对应的函数 。
isPresent
User user = new User("小明",16,new Address());boolean b1 = Optional.ofNullable(user.getAddress()).isPresent();System.out.println(b1);// true
ifPresentUser user = new User("小明",16,new Address());Optional.ofNullable(user.getAddress()).ifPresent(address -> System.out.println(address));
值转换函数:map和flagMap值转换的就是对Optional对象中的value值进行转换,对值应用(调用)作为参数的函数 , 然后将返回的值包装在 Optional中map
User user = new User("小明",16,new Address());String s1 = Optional.ofNullable(user).map(s -> s.getName()).get();
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 使用 Java 枚举和自定义数据类型
- Kotlin 将取代 Java,跻身 Top 10?| TIOBE 11 月榜单发布
- Java服务端程序“假死”怎么办?
- 腾讯认证空间怎么弄,qq腾讯认证名片怎么弄
- 什么手机可以隔空投送,华为手机可以隔空投送苹果手机
- 不是黄钻怎么装扮空间 不用黄钻怎么装扮空间
- 认证空间怎么弄 官方认证空间怎么弄的
- 墨兰根都空了还有救吗 墨兰根都空了能全剪掉吗
- 空调专用阀门图解 空调管路几种阀门知识图
- 室内装饰花卉的分布原则 花卉装饰分类:根据室内外空间分类