永夜-Evernight

永夜降临之前,你都有改变的资格

Java8新特性Optional用法学习笔记

Optional是一个值为null的容器对象,它可以保存类型为T的值,或者仅仅保存null,它是在Java8之后提供的为了简化空值判断并解决NPE(Null Pointer Exception 空指针异常)的类,它提供了很多实用的方法来判断值是否存在。

环境

jdk:jdk1.8.0_51

框架:springBoot

参考文章:

  1. 不要再用 if (obj != null) 判空了!!!
  2. Java8新特性 Optional的正确使用姿势
  3. java8新特性专题之八、java中Optional的使用详细解析

空指针异常

在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

以上内容有不正确的地方烦请指正!🙏🙏🙏


标题:Java8新特性Optional用法学习笔记
作者:luomuren
地址:http://luomuren.top/articles/2022/09/08/1662597652231.html