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
以上内容有不正确的地方烦请指正!???
版权声明:本文为qq_38766930原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。