java.util.Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类。java.util.Optional类可以包含或不包含null值的容器对象。如果存在值,则isPresent方法将返回true,而get方法将返回该值。
除了Optional类之外,还扩展了一些常用类型的Optional对象,比如:OptionalDouble、OptionalInt、OptionalLong,用法基本上相似。
Optional的源码比较简单,归根于它是一个简单的对象容器。下面会结合源码分析它的所有构造、属性、方法和对应的使用场景。
属性和构造
Optional的属性和构造如下:
public final class Optional {
// 这个是通用的代表NULL值的Optional实例
private static final Optional<?> EMPTY = new Optional<>();
// 泛型类型的对象实例
private final T value;
// 实例化Optional,注意是私有修饰符,value为NULL
private Optional() {
this.value = null;
}
// 直接返回内部的EMPTY实例
public static Optional empty() {
@SuppressWarnings(“unchecked”)
Optional t = (Optional) EMPTY;
return t;
}
// 通过value实例化Optional,如果value为NULL则抛出NPE
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
// 通过value实例化Optional,如果value为NULL则抛出NPE,实际上就是使用Optional(T value)
public static Optional of(T value) {
return new Optional<>(value);
}
// 如果value为NULL则返回EMPTY实例,否则调用Optional#of(value)
public static Optional ofNullable(T value) {
return value == null ? empty() : of(value);
}
// 暂时省略其他代码
}

本文详细介绍了Java8的Optional类,包括其属性、构造方法、get()、isPresent()、ifPresent()、filter()、map()、flatMap()、orElse()、orElseGet()和orElseThrow()等常用方法。Optional旨在解决值判断问题,防止NullPointerException。文章通过实例演示了Optional的使用,并警告了错误的使用方式,如不应与ifPresent()结合使用进行null检查。
最低0.47元/天 解锁文章

191

被折叠的 条评论
为什么被折叠?



