Optional 可选的 。出现的目的 ,为了解决空指针异常 。
1.是一个容器对象(相当于一个包装的概念),可能包含也可能不包含一个非空的值。如果一个值存在的话,那么isPresent()方法返回一个true,get()方法返回这个值本身。
2.提供一些额外的方法 ,如 orElse() ,isPresent()等
3.是一个基于值得类,所以尽量避免一些hashCode,==等操作 ,可能会产生一些不可预期的错误
构造方法全部是私有的
/**
* Constructs an empty instance.
*
* @implNote Generally only one empty instance, {@link Optional#EMPTY},
* should exist per VM.
*/
private Optional() {
this.value = null;
}
/**
* Constructs an instance with the value present.
*
* @param value the non-null value to be present
* @throws NullPointerException if value is null
*/
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
并不能从外部调用构造方法 。因此需要用提供的静态工厂方法获取Optional的实例
构造一个值为空的Optional对象
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
构造一个不为空的Optional对象 ,需要传一个非null值
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
另外两个重要的方法的
判断被包装的值是否为null
public boolean isPresent() {
return value != null;
}
获取被包装的值
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
之前判断一个字符串不为空,然后执行某些操作的写法
String str= "zhangsan";
if(null != str){
System.out.println(str);
}
使用optional
Optional<String> optional = Optional.ofNullable(str); //构造一个可能为空的optional对象
if(optional.isPresent()){
System.out.println(optional.get());
}
此种方式与之前的方式其实本质上并无区别
使用更简洁的方式 ifPrecsent 方法 接收一个 Comsumer函数式接口作为参数,先判断值是否为空 ,如果不为空执行传入Comsumer接口实例的accept方法。简化了代码
optional.ifPresent(s-> System.out.println(str));
判断一个list 是否为null ,如果为null 返回一个空的list(注意是集合是空的 ,并不是null)
Employee employee1 = new Employee();
Employee employee2 = new Employee();
Employee employee3 = new Employee();
List<Employee> employees= Arrays.asList(employee1,employee2,employee3);
Optional<List<Employee>> optional = Optional.ofNullable(employees);
employees=optional.orElse(Collections.emptyList());