1.说明
public final class Optional<T> extends Object
可能包含或不包含非空值的容器对象。 如果一个值存在, isPresent()
将返回true
和get()
将返回值。
提供依赖于存在或不存在包含值的其他方法,例如orElse()
(如果值不存在则返回默认值)和ifPresent()
(如果值存在则执行代码块)。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
2.API
3.常用方法及示例
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()。
fiatMap(Function mapper);与 map 类似,要求返回值必须是Optional。
示例:
package com.example.demo.optional;
import com.example.demo.domain.Student;
import java.util.Optional;
/**
* @Author linaibo
* @Date 2023/2/26 14:22
* @PackageName:com.example.demo.optional
* @ClassName: OptionalDemo1
* @Version 1.0
*/
public class OptionalDemo1 {
public static void main(String[] args) {
// of方法: 创建一个 Optional 实例。
Optional<Student> student = Optional.of(new Student());
if (student.isPresent()) {
// 执行结果
System.out.println(student.get());
} else {
System.out.println("不存在");
}
// empty方法:创建一个空的 Optional 实例。结果为不存在
Optional<Object> empty = Optional.empty();
if (empty.isPresent()) {
empty.get();
} else {
// 执行结果
System.out.println("不存在");
}
// ofNullable:若 t 不为 null,创建 Optional 实例,否则创建空实例。
Optional<Student> student1 = Optional.ofNullable(new Student());
if (student1.isPresent()) {
// 执行结果
System.out.println(student1.get());
} else {
System.out.println("不存在");
}
// orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。
// 有值的场合
Optional<Student> empty1 = Optional.of(new Student());
Student student2 = new Student();
student2.setStudentId(1);
student2.setStudentNo("123");
student2.setStudentName("张三");
Student student3 = empty1.orElse(student2);
System.out.println(student3);
// 无值的场合
Optional<Student> empty12 = Optional.empty();
Student student22 = new Student();
student22.setStudentId(1);
student22.setStudentNo("123");
student22.setStudentName("张三");
Student student33 = empty12.orElse(student22);
System.out.println(student33);
// orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。
Optional<Student> empty2 = Optional.empty();
Student studen5 = empty2.orElseGet(() -> {
Student student4 = new Student();
student4.setStudentId(1);
student4.setStudentNo("123");
student4.setStudentName("张三");
return student4;
});
System.out.println(studen5);
}
}
error示例:
// empty方法:创建一个空的 Optional 实例。结果为不存在
Optional<Object> empty = Optional.empty();
empty.get();
执行结果:
Exception in thread "main" java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:135)
at com.example.demo.optional.OptionalDemo1.main(OptionalDemo1.java:29)
表示被请求的元素不存在。
Optional<Object> empty = Optional.of(null);
if (empty.isPresent()) {
empty.get();
} else {
// 执行结果
System.out.println("不存在");
}
执行结果:
Exception in thread "main" java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at java.util.Optional.<init>(Optional.java:96)
at java.util.Optional.of(Optional.java:108)
at com.example.demo.optional.OptionalDemo1.main(OptionalDemo1.java:27)
在of方法中直接传递一个null,则会出现空指针异常。
4.总结
方法的返回值可以使用optional进行包装,避免空指针。
一般调用ofNullable()方法,然后使用isPresent()方法判断是否有值,没有值得场合直接抛出异常;有值的场合继续后续处理。当然有时候传入的对象有可能是空对象。使用对象的某个具体的项目时要进行判断看看是否有值。