曹耘豪的博客

Java基础之Optional

  1. Optional简介
  2. 如何构造一个Optional
  3. 如何使用Optional对象
    1. get
    2. isPresent
    3. ifPresent
    4. filter
    5. map
    6. flatMap
    7. orElse
    8. orElseGet
    9. orElseThrow
    10. equals, hashCode
  4. Optional的最佳实践
    1. 禁止
    2. 不建议
    3. 建议

Optional简介

Optional是 Java 8 新增的特性,能更好的处理空值

如何构造一个Optional

对于一个Optionalvalue是不可变得,只能通过以上前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

Optional的最佳实践

禁止

不建议

建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Map<String, Map<String, Object>> map; // 我们不知道是否为null

// 不使用 Optional
Object ret1 = null;

if (map != null) {
Map<String, Object> tmp = map.get("k1");
if (tmp != null) {
ret1 = tmp.get("kk1");
}
}
if (ret1 == null) {
ret1 = new Object();
}

// 使用 Optional,优雅!
Object ret2 = Optional.ofNullable(map) // Optional<Map<String, Map<String, Object>>>
.map(kkv -> kkv.get("k2")) // Optional<Map<String, Object>>
.map(kv -> kv.get("kk2")) // Optional<Object>
.orElseGet(Object::new); // 或者 orElse(new Object())
   /