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
}