Optional类
1 简介
到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。 以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类, Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
2 创建Optional
方法 | 描述 |
---|
Optional.of(T t) | 创建一个Optional实例,t必须非空 |
Optional.empty() | 创建一个空的Optional实例 |
Optional.ofNullable(T t) | t可以为null |
@Test
public void test01(){
Student student = new Student();
Optional<Student> student1 = Optional.of(student);
System.out.println(student1);
System.out.println(Optional.empty());
student= null;
System.out.println(Optional.ofNullable(student));
}
3 判断Optional是否含有对象
方法 | 描述 |
---|
boolean isPresent() | 判断是否包含对象 |
void idPresent(Consumer<? super T> consumer) | 如果有值,就执行Consumer 接口的实现代码,并且该值会作为参数传给它 |
@Test
public void test02(){
Student student = new Student();
System.out.println(Optional.ofNullable(student).isPresent());
Optional.ofNullable(student).ifPresent(System.out::println);
}
4 获取Optional容器的对象
方法 | 描述 |
---|
T get() | 调用对象包含值,返回该值,否则抛异常 |
T orElse(T other) | 如果有值则将其返回,否则返回指定的other对象 |
T orElseGet(Supplier<? extends T> other) | 如果有值则将其返回,否则返回由 Supplier接口实现提供的对象 |
T orElseThrow(Supplier<? extends X> exceptionSupplier) | 如果有值则将其返 回,否则抛出由Supplier接口实现提供的异常 |
@Test
public void test03() throws Throwable {
Student student = new Student();
System.out.println(Optional.ofNullable(student).get());
student =null;
System.out.println(Optional.ofNullable(student).orElse(Student.builder().name("测试").build()));
System.out.println(Optional.ofNullable(student).orElseGet(() -> Student.builder().name("王二麻子").build()));
System.out.println(Optional.ofNullable(student).orElseThrow(() -> new Throwable("出异常了")));