Java8实战
Optional
2018-09-08
简介
Optional是 Java 8 新增的特性,能更好的处理空值
如何构造一个Optional
Optional.of(T value): value不可为null,否则直接NPEOptional.ofNullable(T value): value可为空Optional.empty(): 构造一个值为null的Optional对象
对于一个Optional,value是不可变得,只能通过以上前2个方法初始化value
如何使用Optional对象
先看Optional有哪些方法
get
1 | public T get() |
获取 value,如果是 null 则报 NoSuchElementException。
isPresent
1 | public boolean isPresent() |
判断value是否存在。
ifPresent
1 | public void ifPresent(Consumer<? super T> consumer) |
如果存在,则调用consumer。
filter
1 | public Optional<T> filter(Predicate<? super T> predicate) |
value是否符合条件,否则返回Optional.empty()。
map
1 | public<U> Optional<U> map(Function<T, U> mapper) |
如果value存在,则调用mapper转化为新类型,内部包装为可为空的Optional对象。
flatMap
1 | public<U> Optional<U> flatMap(Function<T, Optional<U>> mapper) |
如果value存在,则调用mapper直接转化为新类型的Optional对象。
orElse
1 | public T orElse(T other) |
如果value存在(不为null)则返回,否则返回other。
orElseGet
1 | public T orElseGet(Supplier<? extends T> other) |
如果value存在(不为null)则返回,否则调用other以返回值。
orElseThrow
1 | public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X |
如果value不为null则返回,否则抛出异常,异常由exceptionSupplier提供。
equals, hashCode
- equals: 先比较是否都是
Optional对象,然后比较value的值 - hashCode: 返回的是value的hashCode
Optional的最佳实践
禁止
Optional不能被序列化,因此不能使用于字段
不建议
Optional不建议用于函数的入参。试想传入一个Optional.empty()有多奇怪,可以使用相同函数名来避免。- 不建议在使用
isPresent后接着使用get,那将和用==判断无异,不能体现Optional的优越性,反而麻烦。
建议
- 建议使用于函数的返回值,提醒调用者对null的处理,也使调用者也变得优雅起来~
- 建议使用于连续调用,减少
if(obj != null)的判断,也不失可读性,可谓优雅。看如下例子
1 | Map<String, Map<String, Object>> map; // 我们不知道是否为null |