JDK8:使用Optional进行变量判空、集合遍历

防止 NPE,是程序员的基本修养。


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 emptyOpt = Optional.empty();
  • of() :使用一个非空的值创建Optional对象:Optional notNullOpt = Optional.of(str);
  • ofNullable() :接收一个可以为null的值:Optional 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函数式接口参数,用于生成默认值;
  • 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 userList = getList();
if (list != null) {
  for(String user: list){
      System.out.println(user);
  }
}

使用JDK8中的Optional实现方式:

List userList = getList();
Optional.ofNullable(userList).orElse(new ArrayList<>()).forEach(user -> {
    System.out.println(user);
});

 

你可能感兴趣的:(JAVA)