Optional

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.

扫描二维码关注公众号,回复: 3230877 查看本文章

*/

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());

猜你喜欢

转载自blog.csdn.net/zpx31613/article/details/81911685