【Java8实战】Optional容器类API应用

引言

在前面的系列博客中,有一篇文章是用Optional取代null,Optional容器类是我们在代码中避免空指针及快速定位空指针的利器。文章的最后,是Optional类下的API总结,本篇博客将把这些方法都实践一下,看下会产生怎样的结果。

创建Optional对象实例
  • of():将指定值用 Optional 封装之后返回,如果该值为 null,则抛出一个 NullPointerException 异常
//1. of创建一个Optional实例
Optional<Employee> emp = Optional.of(new Employee());
Employee employee = emp.get();
System.out.println(employee);
//结果:Employee{name='null', age=null, salary=0.0}

//2. of创建一个null
Optional<Employee> empnull = Optional.of(null);
System.out.println(empnull);
Employee employeeNull = empnull.get();
System.out.println(employeeNull);
//结果:在没有执行empnull.get()方法之前,of()方法会抛出NullException

在这里插入图片描述

  • empty():创建一个空的Optional实例
//empty()创建一个空的Optional实例
Optional<Employee> employee1 = Optional.empty();
System.out.println(employee1.get());
//结果:空的Optional实例下,get()方法取不到值

在这里插入图片描述

  • ofNullable():将指定值用 Optional 封装之后返回,如果该值为 null,则返回一个空的 Optional 对象
//4. ofNullable创建一个Optional实例
Optional<Employee> employee = Optional.ofNullable(new Employee());
System.out.println(employee.get());
//结果:可以获取到对应的实例

//5. ofNullable创建一个null
Optional<Employee> employeeNull = Optional.ofNullable(null);
System.out.println(employeeNull.get());
//结果:可以创建一个Optional实例,但是是一个空的实例,所以get()方法会报与empty()方法同样的错误,取不到值

在这里插入图片描述

判断是否有值
  • isPresent():如果值存在就返回 true,否则返回 false
//为了避免获取到的值为空,我们可以在get()方法前使用isPresent()方法进行判断
Optional<Employee> employee = Optional.ofNullable(null);
if(employee.isPresent()){
    System.out.println(employee.get());
}else{
    System.out.println("该对象值为空");
}
//结果:输出“该对象值为空”
  • ifPresent():如果值存在,就执行使用该值的方法调用,否则什么也不做
//创建一个Optional实例,如果有值,则将返回对象的名字属性设置为zhangsan
Optional<Employee> emp = Optional.ofNullable(new Employee());
emp.ifPresent(employee1 -> employee1.setName("zhangsan"));
System.out.println(emp);
//结果:返回Employee对象,名字属性为zhangsan

//创建一个null,无法获取到对象的值
Optional<Employee> employee = Optional.ofNullable(null);
employee.ifPresent(employee1 -> employee1.setName("lisi"));
System.out.println(employee);
//结果:直接返回一个空的Optional

在这里插入图片描述

获取默认值
  • orElse():如果有值则将其返回,否则返回一个默认值
//8. orElse获取默认值
// 如果不为空,则直接返回创建的Optional对象实例
Optional<Employee> emp = Optional.ofNullable(new Employee());
emp.orElse(new Employee("张三",22,3999.00));
System.out.println(emp);
//如果为空,则返回默认的对象实例
Optional<Employee> employee = Optional.ofNullable(null);
Employee op = employee.orElse(new Employee("李四",43,5888.99));
System.out.println(op);

在这里插入图片描述

  • orElseGet():如果有值则将其返回,否则返回一个由指定的 Supplier 接口生成的值
Employee employee1 = employee.orElseGet(() -> new Employee());
System.out.println(employee1);
//结果:返回Employee对象实例Employee{name='null', age=null, salary=0.0}
处理值
  • map():如果值存在,就对该值执行处理,返回处理后的值。
//9.map
Optional<Employee> employeeOptional = Optional.ofNullable(new Employee("李四",43,5888.99));
Optional<String> empName = employeeOptional.map((e) -> e.getName());
System.out.println(empName);
  • flatMap():如果值存在,就对该值执行处理,返回一个 Optional 类型的值,否则就返回一个空的 Optional 对象。与map类似,但返回值必须是Optional.
//10.flatMap
Optional<Employee> employee = Optional.ofNullable(new Employee("王五",33,3832.99));
Optional<String> optName = employee.flatMap(employee1 -> Optional.of(employee1.getName()));
System.out.println(optName.get());
总结

Optional的最大好处就是帮助避免空指针,以前的代码,对于不确定的返回对象,我们都需要显式进行null判断。而Java8有了Optional容器类,代码中显式判断的代码都不再需要了,对于可能为null的对象,加上Optional类型即可。

猜你喜欢

转载自blog.csdn.net/u013034223/article/details/104576930
今日推荐