Optional 可以很好的简化代码,并处理空指针的问题。空指针当然用 if 也是可以判断的,但是这样会显得代码臃肿不美观
Optional到底如何使用?
//先构造一个学生类
class Student {
private String name;
private String num;
public Student() {
}
public Student(String name, String num) {
this.name = name;
this.num = num;
}
//返回一个集合,如果name和num都为空 则返回一个空集合
public List getStudent() {
List stus = new ArrayList();
stus.add(name);
stus.add(num);
if(name==null&&num==null){
return null;
}
return stus;
}
}
- 如果集合不为空
public static void main(String[] args) {
Student student = new Student("张三", "123");
//调用getStudent返回一个集合
List student1 = student.getStudent();
//通过stream流进行遍历输出
student1.stream().forEach(stu -> System.out.println(stu));
}
运行结果:
- 如果集合为空
public static void main(String[] args) {
//调用空构造
Student student=new Student();
//此时应该返回空集合
List student1 = student.getStudent();
student1.stream().forEach(stu -> System.out.println(stu));
}
输出结果:
可以看到出现了空指针异常
- 下面通过Optional来解决这种异常
public static void main(String[] args) {
Student student=new Student();
List student1 = student.getStudent();
//使用Optional来解决
Optional.ofNullable(student1).orElse(new ArrayList()).stream().forEach(stu-> System.out.println(stu));
}
输出结果:
可以看出没有报空指针异常,什么都没有输出是因为集合为空。上面代码中使用的Optional方法下面来讲解
Optional中的方法
1.of()
//进入of方法
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
// 进入Optional
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
//进入requireNonNull
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
通过层层进入,可以看出如果of()方法传入的为空值的话,会抛出空指针异常。如果不为空,则会返回传入的值。而且会将传入的参数赋值给Optional中的value成员变量
2.ofNullable()
//进入ofNullable.
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
可以看出如果传入的value为null。则会进入empty(),否则调用of()。of()方法就是上面看过的。
//进入empty
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
private static final Optional<?> EMPTY = new Optional<>();
//进入Optional构造方法
private Optional() {
this.value = null;
}
private final T value;
可以看出EMPTY是一个Optional对象。通过Optional构造方法将value变为null。这个过程中并没有抛出空指针异常。此value为Optional类中的一个final修饰的成员变量。
所以ofNullable在传入的value 为 NULL时,不会爆出空指针异常。
3.orElse()
public T orElse(T other) {
return value != null ? value : other;
}
orElse方法会对Optional中的value成员变量进行判断,如果为空返回传入的参数。如果不为空 则为Optional中的value成员变量。
4. get()
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
如果Optional中的value成员变量的值为NULL 抛出异常。
5.总结
ofNullable()经常与orElse()配套使用。
ofNullable()如果传入的参数为空会将Optional中的value成员变量赋值为NULL。
of()如果传入的参数不为空会将Optional中的value成员变量赋值为传入的 参数
ofNullable()、orElse()搭配
如果传入的参数值为空,则会使用orElse中传入的参数值。
如果传入的参数不为空,则会使用ofNullable中传入的参数值。