Optional 是一个值为 null 的容器对象,它可以保存类型为 T 的值,或者仅仅保存 null,它是在 Java8 之后提供的为了简化空值判断并解决 NPE(Null Pointer Exception
空指针异常)的类,它提供了很多实用的方法来判断值是否存在。
环境
jdk:jdk1.8.0_51
框架:springBoot
参考文章:
空指针异常
在 java8 之前,我们再调用一个对象时,如果不确定它是否不为 null,都需要通过
if(user!=null)
来判断对象是否不为 null,如果不判断,就很容易引发空指针异常导致项目报错。例:
SysUser user = userService.getUser(Long userId);
String userName = user.getUserName();
当不确定 getUser()方法是否返回 null 时,为了避免以上代码报空指针异常,我们需要进行判断
SysUser user = userService.getUser(Long userId);
String userName=null;
if(user!=null){
userName = user.getUserName();
}
而在 Java8 中使用 Optional 简化了这一判断
Optional 基本判空操作
- 首先我们使用 Optional 处理上方判断
SysUser sysUser = userService.selectUserById(userId);
String userName = Optional.ofNullable(sysUser).orElse(new SysUser()).getUserName();
ofNullable():如果参数为空时,创建一个空 Optional 对象;不为空时,创建有参 Optional 对象
orElse():如果 Optional 对象为空,则返回该方法入参;如果非空,则返回 Optional 写入的对象
- 使用 lambda 表达式将 sysUser 的值赋给 user
SysUser sysUser = userService.selectUserById(userId);
SysUser user = new SysUser();
Optional<SysUser> userOptional = Optional.ofNullable(sysUser);
userOptional.ifPresent(u-> {
user.setUserName(u.getUserName());
});
Optional 详解
下面详细记录一下 Optional 的用法
1、Optional 对象创建
这里引用一下不要再用 if (obj != null) 判空了!!!中提取的 Optional 源码注解
public final class Optional<T> {
private static final Optional<?> EMPTY = new Optional<>();
private final T value;
//我们可以看到两个构造方法都是private私有的
//说明 我们没办法在外面去new出来Optional对象
private Optional() {
this.value = null;
}
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
//创建出一个包装值为空的Optional对象,因为没有任何参数赋值
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
//创建出一个包装值非空的Optional对象,因为做了赋值
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
// 如果参数value为空,则创建空对象,如果不为空,则创建有参对象
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
}
再做一个简单的实例展示 与上面对应
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optEmpty = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optOf = Optional.of("optional");
// 3、创建包装对象值允许为空也可以不为空的Optional对象
Optional<String> optOfNullable1 = Optional.ofNullable(null);
Optional<String> optOfNullable2 = Optional.ofNullable("optional");
2、Optional 常用方法介绍
以下内容都引用了不要再用 if (obj != null) 判空了!!!的介绍,里面写的很详细,在此不多做说明。
联系方式
作者:永夜
邮箱:Evernight@aliyun.com
以上内容有不正确的地方烦请指正!🙏🙏🙏
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于