最近发现了一个很好用的Java类Optional,看了下源码,简单小结一下我的理解。
例子:
/*帮助过滤掉NULL的情况*/
tempSet = Optional.ofNullable(tempSet).orElse(new HashSet<>());
-
首先调用静态方法ofNullable,
- 然后如果value是null,则调用empty()方法,new一个Optional对象(无参构造)返回
- 如果value不是null,使用of函数new一个Optional对象(有参构造),ofNullable传入的值被记录在private static变量value里。
-
其次到orElse函数,查看private static变量value
- 如果value是null,返回orElse函数传入的other。
- 如果value不是null,返回value。
public final class Optional<T> {
private static final Optional<?> EMPTY = new Optional<>();
private final T value;
private Optional() {//无参构造
this.value = null;
}
public static<T> Optional<T> empty() {//返回无参构造的Optional对象
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
private Optional(T value) {//有参构造
this.value = Objects.requireNonNull(value);
}
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
public static <T> Optional<T> of(T value) {//返回有参构造的Optional对象
return new Optional<>(value);
}
public T orElse(T other) {
return value != null ? value : other;
}
所以对于本例子:
- 如果tempSet是NULL,那么ofNullable就会返回NULL,然后经过orElse函数,因为前面是NULL,所以新建一个HashSet。
- 如果不是NULL,那么ofNullable就会调用有参构造,private final T value记录下值,orElse返回private final T value记录的值即可。