前言
在日常开发中,一不小心就会出现NPE(NullPointerException),因此总少不了去判断一个对象是否为null的场景,常见的做法像这样:
if(obj == null) {
// TODO
} else {
// doSomething()
}
这样做没什么问题,但是还不够“优(zhuang)雅(X)”,所以 jdk 1.8 之后为我们新增了一个Optional类,从此就在判null的路上越走越远…
正题:Optional的妙用
1、看外貌:
public final class Optional<T> {...}
final类型的类,不可继承
2、看构造:
// 无参
private Optional() {
this.value = null;
}
// 有参
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
提供两个构造函数,但都是私有的,意味着我们并不能构造Optional的实例。
3、看属性
// 构造一个空的Optional实例
private static final Optional<?> EMPTY = new Optional<>();
// final类型的value,如果当前对象不为null,则value等于当前对象,否则value为null
private final T value;
4、看方法
Optional类不能new实例,因此要使用Optional,只能通过它的静态方法:
// 创建一个value=null的Optional实例
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
// 根据传入的对象构造一个有值的Optional实例,如果传入的对象value=null,则会报NPE异常
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
// 根据传入的对象构造一个Optional实例,如果传入的对象为null,则构造一个value=null的Optional实例,
// 否则构造一个value等于传入对象的Optional实例
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
5、看使用
// 判断一个对象是否为null,是则返回false,不是返回true
Optional.ofNullable(obj).isPresent();
// 对象不为null,则执行ifPresent()方法,否则什么也不做
Optional.ofNullable(obj).ifPresent(o -> System.out.println("对象不为null会执行这里:" + o))
// 对象不为null返回对象的值,否则返回orElse()里面的值
Optional.ofNullable(obj).orElse(otherValue)
// 对象不为null返回对象的值,否则执行orElseGet()里面的逻辑
Optional.ofNullable(null).orElseGet(() -> doSomething())
// 对象不为null则返回对象的值,否则抛出orElseThrow()里面定义的异常
Optional.ofNullable(s).orElseThrow(() -> new BaseException("400", "参数不能为空"))
以上是Optional类中常用的几种方法,还有一些其他的方法大家可以自行阅读源码学习使用。

本文深入讲解了Java 8中Optional类的使用方法,包括其构造方式、常用API介绍及实际应用场景,帮助开发者优雅地处理空值问题。
1222

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



