目录
Optional
是一个容器对象,该容器里可能包含非空值也可能不包含非空值。最主要的用途就是为了规避 NPE 异常(传入的对象为 null 造成)。
isPresent
方法返回 true,通过 get
方法获取 valueOptional
也提供了额外的方法,这些方法根据是否存在 value 来发挥作用。
请不要在 Optional
对象中使用 hashcode
,synchronized
,==
,否则会产生不可预料的影响。因为 Optional
是基于值的类。
关于什么是 Value-based Clases,我找到 Oracle 的一篇官方文档:Value-based Classes
某些类(如 java.util.Optional 和 java.time.LocalDateTime) 是基于值的。基于值的实例有如下特征:
equals()
、hashCode()
、toString()
方法的实现,且实现方法仅依赖于实例自身的状态发生变化,而不依赖外部的对象或变量的状态==
比较两个实例,使用 hashcode 获取实例信息,使用 synchronized
获取内部锁equals()
方法而不是 ==
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
Optional
是一个容器,容器里面包着一个值,这个值是泛型Optional
对象,只能通过静态工厂方法构造对象of
:返回一个容器的值不为 null 的对象,使用该方法要求调用者调用 of 方法时,参数值不为空,否则会抛出 NPE 异常。
public static <T> Optional<T> of(T value) { return new Optional<>(value); }ofNullable
:构造一个可能为空,也可能不为空的 optional 对象。
public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); }empty
:返回容器的值为 null 的对象
public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; }isPresent
:判断该对象是否存在get
:获取容器的值orElse
:容器值不为空,将 value 打印出来;为空,返回指定值。
public T orElse(T other) { return value != null ? value : other; }orElseGet
:该方法不接受参数。容器值不为空,返回 value;为空,返回指定值
public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); }
举例:
System.out.println(optional.orElseGet(() -> "nihao"));orElseThrow
:容器值不为空,返回 value;为空,抛出异常。map
:映射,将一个值映射成另一个值。如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null ,则创建包含映射返回值的 Optional
作为 map
方法返回值,否则返回空 Optional
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value)); } }
举例:
System.out.println(optional.map(thecompant -> theCompany.getEmployees()). orElse(Collections.emptylist()));注意
在企业开发中,我们经常通过 orElse
来规避 NPE 异常。
Optional
无法被序列化。所以不要试图将 Optional
作为方法参数进行定义,也不要在类当中声明 Optional
类型的成员变量。Optional
通常只作为方法的返回值,用来规避空指针异常。
在使用 Optional
时,应该使用函数式的编程风格。