介绍
到目前为止,臭名昭著的空指针异常是导致
Java
应用程序失败的最常见原因。 以前,为了解决空指针异常,Google
公司著名的
Guava
项目引入了
Optional
类, Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代 码。受到Google Guava
的启发,
Optional
类已经成为
Java 8
类库的一部分。
Optional<T>
类
(java.util.Optional)
是一个容器类,它可以保存类型
T
的值,代表 这个值存在。或者仅仅保存null
,表示这个值不存在。原来用
null
表示一个值不 存在,现在 Optional
可以更好的表达这个概念。并且可以避免空指针异常。
Optional
类的
Javadoc
描述如下:这是一个可以为
null
的容器对象。如果值存在 则isPresent()
方法会返回
true
,调用
get()
方法会返回该对象。
方法
Optional
提供很多有用的方法,这样我们就不用显式进行空值检测。
创建
Optional
类对象的方法:
Optional.of(T t) :
创建一个
Optional
实例,
t
必须非空
;
Optional.empty() :
创建一个空的
Optional
实例
Optional.ofNullable(T t)
:
t
可以为
null
判断
Optional
容器中是否包含对象:
boolean isPresent() :
判断是否包含对象
void ifPresent(Consumer<? super T> consumer)
:
如果有值,就执行
Consumer
接口的实现代码,并且该值会作为参数传给它。
获取
Optional
容器的对象:
T get():
如果调用对象包含值,返回该值,否则抛异常
T orElse(T other)
:
如果有值则将其返回,否则返回指定的
other
对象。
T orElseGet(Supplier<? extends T> other)
:
如果有值则将其返回,否则返回由
Supplier
接口实现提供的对象。
T orElseThrow(Supplier<? extends X> exceptionSupplier)
:
如果有值则将其返
回,否则抛出由
Supplier
接口实现提供的异常。
代码
之前我们在介绍Java8新特性的时候创建过一个Employee类
package com.csdn.test;
import com.csdn.entity.Employee;
import org.junit.Test;
import java.util.Optional;
/**
* @author summer
* @date 2022-04-18 14:50
*/
public class TestOptional {
@Test
public void test(){
// 此方法创建的实例传入的参数不能为空
Optional<Employee> employee = Optional.of(new Employee());
System.out.println(employee);
// employee = Optional.of(null); 空指针异常
// System.out.println(employee);
//方法参数可以为空
Optional<Employee> employee1 = Optional.ofNullable(new Employee());
System.out.println(employee1);
//判断是否包含对象
System.out.println(employee1.isPresent());
employee1 = Optional.ofNullable(null);
System.out.println(employee1);//Optional.empty
// System.out.println(employee1.get());//java.util.NoSuchElementException: No value present
System.out.println(employee1.isPresent());
}
}