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)

常规实现方式:

 
  1. // 从前台界面获取输入的用户信息

  2. String user = getUserFromUI();

  3. if (user == null){

  4. return 0;

  5. } else {

  6. return user.length();

  7. }

使用JDK8中的Optional实现方式:

 
  1. // 从前台界面获取输入的用户信息

  2. String user = getUserFromUI();

  3. return Optional.ofNullable(user).orElse("").length;

Optional循环遍历集合

例如:循环遍历集合

常规实现方式:

 
  1. List<String> userList = getList();

  2. if (list != null) {

  3. for(String user: list){

  4. System.out.println(user);

  5. }

  6. }

使用JDK8中的Optional实现方式:

 
  1. List<String> userList = getList();

  2. Optional.ofNullable(userList).orElse(new ArrayList<>()).forEach(user -> {

  3. System.out.println(user);

  4. });

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐