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

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

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3065 引用 • 8186 回帖 • 412 关注
  • 知识点
    5 引用 • 40 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
luomuren
永夜降临之前,你都有改变的资格
融合块、大纲和双向链接
构建你永恒的数字花园
思源笔记是一款本地优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步