@since 1.8
为了解决空指针异常,受到 Google Guava 的启发,Optional 类已经成为 Java 8 类库的一部分。
Optional 实际上是个容器:它可以保存类型T的值,或者仅仅保存 null。Optional 提供很多有用的方法,这样就不用显式进行空值检测。
1 初始化
- Optional.ofNullable : 允许传递为 null 参数
- Optional.of : 如果传递的参数是 null,抛出异常 NullPointerException
2 判断
- Optional.isPresent : 判断值是否存在。非空true,否则false
3 若存在
- Optional.get - 如果值存在,返回它,否则抛出异常
- Optional.ifPresent: 如果值存在则使用该值调用 consumer , 否则不做任何事情。
- Optional.filter : 如果值存在,并匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
- Optional.map : 如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。
4 若不存在
- Optional.orElse : 如果值存在,返回它,否则返回默认值
- Optional.orElseGet : 如果值存在,返回它,否则返执行回调函数
- Optional.orElseThrow : 如果值存在,返回它,否则抛出指定异常
Optional< String > fullName = Optional.ofNullable( null );
fullName.isPresent();//false
fullName.orElseGet( () -> "[none]" );//[none]
fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" );//Hey Stranger!
// Returns maximum value in collection as an Optional<E>
public static <E extends Comparable<E>> Optional<E> max(Collection<E> c) {
if (c.isEmpty())
return Optional.empty();
E result = null;
for (E e : c)
if (result == null || e.compareTo(result) > 0)
result = Objects.requireNonNull(e);
return Optional.of(result);
}
// Using an optional to provide a chosen default value
String lastWordInLexicon = max(words).orElse("No words...");
// Using an optional to throw a chosen exception
Toy myToy = max(toys).orElseThrow(TemperTantrumException::new);
// Using optional when you know there’s a return value
Element lastNobleGas = max(Elements.NOBLE_GASES).get();