Optional 是 Java8 中新引入的一个类,它用于作为一个值可能为 null 或 non-null 的容器对象。如果一个方法的返回值是一个 Optional 类型,这是在向我们表明该方法的返回值可能为 null,调用时需要进行判空处理,这样可以有效的防止 NullPointerException 异常。如果通过调用 Optional.isPresent() 返回 true,则表明结果 non-null,此时可以放心调用 Optional.get() 获得此对象。

of

通过调用 Optional.of 可以构造一个 Optional 对象,参数要求是 non-null 值,否则抛出 NullPointerException 异常。

1
2
3
4
5
6
7
public static void main(String[] args) {
Optional<String> optional = Optional.of("foo");
if (optional.isPresent()) {
String result = optional.get();
System.out.println(result); // foo
}
}

ofNullable

通过调用 Optional.ofNullable 可以构造一个 Optional 对象,参数如果是 null 值,则返回一个值为空的 Optional 对象。

1
2
3
4
public static void main(String[] args) {
Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional.isPresent()); // false
}

orElse

如果 Optional 对象的值不存在,则返回 orElse 给定的值。

1
2
3
4
5
public static void main(String[] args) {
Optional<String> optional = Optional.ofNullable(null);
String result = optional.orElse("foo");
System.out.println(result); // foo
}

ifPresent

如果 Optional 对象的值存在,则将该值作为参数执行 Consumer。否则,什么事情都不做。

1
2
3
4
public static void main(String[] args) {
Optional<String> optional = Optional.of("foo");
optional.ifPresent((s) -> System.out.println(s.length())); // 3
}

orElseGet

如果 Optional 对象的值存在,则直接返回该值。否则,调用 Supplier 并返回调用的结果值。

1
2
3
4
5
public static void main(String[] args) {
Optional<Date> optional = Optional.ofNullable(null);
Date result = optional.orElseGet(Date::new);
System.out.println(result); // Fri Sep 16 18:35:30 CST 2016
}

filter

如果 Optional 对象的值不存在或值存在且该值匹配参数给定的 Predicate 规则,则返回当前的 Optional 对象本身。否则,返回一个空的 Optional 对象。

1
2
3
4
5
6
public static void main(String[] args) {
Optional<String> optional1 = Optional.of("foo");
Optional<String> optional2 = optional1.filter((s) -> s.length() == 3);
System.out.println(optional2.isPresent()); // true
System.out.println(optional2.get()); // foo
}

map

如果 Optional 对象的值存在,则将该值作为参数调用 Function,如果调用的结果为 non-null 值,则返回一个新的以该结果作为值的 Optional 对象,否则,返回一个空的 Optional 对象。

1
2
3
4
5
6
public static void main(String[] args) {
Optional<String> optional1 = Optional.of("foo");
Optional<Integer> optional2 = optional1.map((s) -> s.length());
System.out.println(optional2.isPresent()); // true
System.out.println(optional2.get()); // 3
}