文章目录
定义
- java.util.Optional
- 为解决空引用异常引入的,用于封装单值元素的容器(single-value container),即,基于Optional提供的一系列方法,操作封装在Optional容器中的,可能引起空引用的元素对象
import javax.swing.text.html.Option;
import java.util.Optional;
class Student{
private int id;
private String name;
Student(int id,String name){
this.id=id;
this.name=name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
1. 创建容器
empty() / of() / ofNullable()
public class Test {
public static void main(String[] args) {
Optional<Student> s = Optional.empty(); // 创建一个空的 Optional 实例
Student d = new Student(2021224,"张三");
Optional<Student> t = Optional.of(d); //创建一个 Optional 实例,d不能为null
Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
}
}
2. 执行操作
基于容器是否为空,执行操作,无返回值
ifPresent() / ifPresentOrElse()
public class Test {
public static void main(String[] args) {
Optional<Student> s = Optional.empty(); // 创建一个空的 Optional 实例
Student d = new Student(2021224,"张三");
Optional<Student> t = Optional.of(d); //创建一个 Optional 实例,d不能为null
Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
t.ifPresent(i -> System.out.println(i.getName())); //不为空时执行操作
u.ifPresentOrElse(i -> System.out.println(i.getName()), () -> System.out.println("it is null")); //不为空时执行前一个操作,为空时执行后一个操作
}
}
执行结果:
张三
it is null
Process finished with exit code 0
3. 中间操作
将操作结果,置于新Optional容器以执行后续操作,结果为空,也会返回相同类型的空容器
filter() / map() / or()
public class Test {
public static void main(String[] args) {
Optional<Student> s = Optional.empty(); // 创建一个空的 Optional 实例
Student d = new Student(2021224,"张三");
Student e = new Student(2021225,"李四");
Optional<Student> t = Optional.of(d); //创建一个 Optional 实例,d不能为null
Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
t.filter(i -> i.getName()=="张三") //过滤
.ifPresentOrElse(i -> System.out.println(i.getName()), () -> System.out.println("null"));
u.filter(i -> i.getName()=="张三") //过滤,空的 Optional 也可以执行,结果为空
.ifPresentOrElse(i -> System.out.println(i.getName()), () -> System.out.println("null"));
System.out.println(t.map(Student::getName).get()); //映射
System.out.println("------");
u.or(() -> Optional.ofNullable(e)).ifPresent(i -> System.out.println(i.getName())); //为空时执行指令
}
}
执行结果:
张三
null
张三
------
李四
Process finished with exit code 0
4. 获取操作
获取容器中对象
orElse() / orElseGet() / get()
public class Test {
public static void main(String[] args) {
Optional<Student> s = Optional.empty(); // 创建一个空的 Optional 实例
Student d = new Student(2021224,"张三");
Student e = new Student(2021225,"李四");
Optional<Student> t = Optional.of(d); //创建一个 Optional 实例,d不能为null
Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
System.out.println(t.orElse(e).getName());
System.out.println(u.orElse(e).getName()); //为空时执行操作,获取 Student 对象
System.out.println(t.orElseGet(() -> e).getName());
System.out.println(u.orElseGet(() -> e).getName()); //为空时执行操作,获取 Student 对象
System.out.println(t.get().getName()); //获取对象,为空时报错
}
}
执行结果:
张三
李四
张三
李四
张三
Process finished with exit code 0
5. 判断方法
判断当前容器是否为空
isPresent() / isEmpty()
public class Test {
public static void main(String[] args) {
Optional<Student> s = Optional.empty(); // 创建一个空的 Optional 实例
Student d = new Student(2021224,"张三");
Optional<Student> t = Optional.of(d); //创建一个 Optional 实例,d不能为null
Optional<Student> u = Optional.ofNullable(null); //创建一个 Optional 实例,d可以为null,返回一个空的实例
System.out.println(s.isPresent()); //非空为true
System.out.println(s.isEmpty()); //空为true
}
}
执行结果:
false
true
Process finished with exit code 0