JDK8:使用Optional进行变量判空、集合遍历
NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方。NPE常是导致Java应用程序失败的最常见的原因。在日常研发工作中,经常会处理各种变量、集合,但在使用的过程中,往往要进行空判断,不然会出现NPE。JDK8新特性之Optional介绍Optional类实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional 类的引入很好的解决空
NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方。NPE常是导致Java应用程序失败的最常见的原因。在日常研发工作中,经常会处理各种变量、集合,但在使用的过程中,往往要进行空判断,不然会出现NPE。
JDK8新特性之Optional介绍
Optional类实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional 类的引入很好的解决空指针异常。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。尽量避免在程序中直接调用Optional对象的get()和isPresent()方法,避免使用Optional类型声明实体类的属性。
- Optional.of(T t) : 创建一个 Optional 实例
- Optional.empty() : 创建一个空的 Optional 实例
- Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
- isPresent() : 判断是否包含值
- orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
- orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
- map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
- flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
1.创建optional对象,一般用ofNullable()而不用of()
- empty() :用于创建一个没有值的Optional对象:Optional<String> emptyOpt = Optional.empty();
- of() :使用一个非空的值创建Optional对象:Optional<String> notNullOpt = Optional.of(str);
- ofNullable() :接收一个可以为null的值:Optional<String> nullableOpt = Optional.ofNullable(str);
2.判断Null:
isPresent():如果创建的对象实例为非空值的话,isPresent()返回true,调用get()方法会返回该对象,如果没有值,调用isPresent()方法会返回false,调用get()方法抛出NullPointerException异常。
3.获取对象:
get()
4.使用map提取对象的值
如果我们要获取User对象中的roleId属性值,常见的方式是先判断是否为null然后直接获取,但使用Optional中提供的map()方法可以以更简单的方式实现
5.使用orElse方法设置默认值,Optional类还包含其他方法用于获取值,这些方法分别为:
- orElse():如果有值就返回,否则返回一个给定的值作为默认值;
- orElseGet():与orElse()方法作用类似,区别在于生成默认值的方式不同。该方法接受一个Supplier<? extends T>函数式接口参数,用于生成默认值;
- orElseThrow():与前面介绍的get()方法类似,当值为null时调用这两个方法都会抛出NullPointerException异常,区别在于该方法可以指定抛出的异常类型。
6.使用filter()方法过滤
filter()方法可用于判断Optional对象是否满足给定条件,一般用于条件过滤,在代码中,如果filter()方法中的Lambda表达式成立,filter()方法会返回当前Optional对象值,否则,返回一个值为空的Optional对象。
Optional判空
Optional判空写法
Optional.ofNullable(变量).orElse(默认数值);
例如:求字符串user的长度(为空的时候返回0)
常规实现方式:
-
// 从前台界面获取输入的用户信息
-
String user = getUserFromUI();
-
if (user == null){
-
return 0;
-
} else {
-
return user.length();
-
}
使用JDK8中的Optional实现方式:
-
// 从前台界面获取输入的用户信息
-
String user = getUserFromUI();
-
return Optional.ofNullable(user).orElse("").length;
Optional循环遍历集合
例如:循环遍历集合
常规实现方式:
-
List<String> userList = getList();
-
if (list != null) {
-
for(String user: list){
-
System.out.println(user);
-
}
-
}
使用JDK8中的Optional实现方式:
-
List<String> userList = getList();
-
Optional.ofNullable(userList).orElse(new ArrayList<>()).forEach(user -> {
-
System.out.println(user);
-
});
更多推荐
所有评论(0)