Java之Optional类判空使用及说明

 更新时间:2026年06月04日 09:51:15   作者:我叫晨曦啊  
这篇文章主要介绍了Java之Optional类判空使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

简介

Optional是一个容器对象,它可能包含某个值,也可能不包含,它的设计目的是为了解决空指针异常问题。

使用Optional可以避免在代码中显式地检查null值。

不过这个类有好有坏,适当使用即可,其缺点就是造成代码过于冗长,最主要是引入额外的对象开销。

常见的Optional用法

现有一个实体类UserVo,该类有两个属性usernamepassword,下述示例以该实体类测试。

创建Optional对象

of()方法

创建一个包含指定非null值的Optional对象

public class OptionalTest {
    public static void main(String[] args) {
        UserVo userVo = new UserVo();
        userVo.setUsername("张三");
        Optional<String> usernameOptional = Optional.of(userVo.getUsername());
        if (usernameOptional.isPresent()) {
            System.err.println("获取的信息为 " + usernameOptional.get());
        } else {
            System.err.println("usernameOptional为空");
        }
    }
}

// 执行结果
获取的信息为 张三

使用of()方法创建了一个包含非null值的Optional对象。然后我们通过调用isPresent()方法检查Optional是否包含值。

如果Optional包含值,则调用get()方法获取该值并打印输出;否则打印输出Optional为空。

使用of()方法时,如果传入的值为null,会立即抛出NullPointerException异常。因此,在使用of()方法创建Optional对象时,需要确保传入的值不为空。

如果值可能为空,可以使用ofNullable()方法创建Optional对象,该方法可以接受null值。

ofNullable()方法

创建一个包含指定值的Optional对象,如果值为null,则创建一个空的Optional对象。

public class OptionalTest {
    public static void main(String[] args) {
        UserVo userVo = new UserVo();
        // userVo.setUsername("张三");
        Optional<String> usernameOptional = Optional.ofNullable(userVo.getUsername());
        if (usernameOptional.isPresent()) {
            System.err.println("获取的信息为 " + usernameOptional.get());
        } else {
            System.err.println("usernameOptional为空");
        }
    }
}

// 执行结果
usernameOptional为空

使用ofNullable()方法创建了一个包含指定值的Optional对象。如果值为null,则创建一个空的Optional对象。然后我们通过调用isPresent()方法检查Optional是否包含值。如果Optional包含值,则调用get()方法获取该值并打印输出;否则打印输出Optional为空。

使用ofNullable()方法创建的Optional对象可以接受null值,不会立即抛出NullPointerException异常。这样可以更灵活地处理可能为空的值。

empty()方法

创建一个空的Optional对象。

public class OptionalTest {
    public static void main(String[] args) {
        Optional<String> usernameOptional = Optional.empty();
        if (usernameOptional.isPresent()) {
            System.err.println("获取的信息为 " + usernameOptional.get());
        } else {
            System.err.println("usernameOptional 为空");
        }
    }
}

// 执行结果
usernameOptional为空

使用empty()方法创建了一个空的Optional对象。然后我们通过调用isPresent()方法检查Optional是否包含值。

由于我们使用empty()方法创建的Optional对象是空的,所以isPresent()返回值为false,程序会打印输出Optional为空,使用empty()方法创建的Optional对象始终是空的,不包含任何值,这在某些情况下可以用于表示缺失值。

判断Optional是否包含值

isPresent()方法

如果Optional对象包含值,则返回true,否则返回false,上述示例判断部分已经用到

ifPresent()方法

如果Optional对象不为空则执行ifPresent()中的处理逻辑,否则不予执行。

public class OptionalTest {
    public static void main(String[] args) throws Throwable {
        UserVo userVo = new UserVo();
        userVo.setUsername("张三");
        Optional<String> usernameOptional = Optional.ofNullable(userVo.getUsername());
        usernameOptional.ifPresent(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.err.println("业务逻辑处理");
            }
        });
    }
}

userVo正常给userName赋值时

输出结果:业务逻辑处理

没有赋值时,不输出任何结果

获取Optional中的值

get()方法

如果Optional对象包含值,则返回该值,否则抛出NoSuchElementException异常,上述示例判断部分已经用到

注意,使用get()方法时,一定要先使用isPresent()方法来检查Optional对象是否包含值,以避免抛出异常

filter()方法

用于过滤 Optional 对象中的值,只有当值满足特定条件时才保留

public class OptionalTest {
    public static void main(String[] args) throws Throwable {
        UserVo userVo = new UserVo();
        userVo.setUsername("张三");
        Optional<String> usernameOptional = Optional.ofNullable(userVo.getUsername());
        Optional<String> optional = usernameOptional.filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length() == 2;
            }
        });
        System.err.println(optional.get());
    }
}

上述过滤条件为字符串的长度是否为2,是的话取出值

输出结果:张三

但当长度判断不是等于2时,过滤后没有符合条件的数据,会抛出NoSuchElementException异常。

orElse()方法

如果Optional对象包含值,则返回该值,否则返回指定的默认值。

public class OptionalTest {
    public static void main(String[] args) {
        UserVo userVo = new UserVo();
        userVo.setUsername("张三");
        Optional<String> usernameOptional = Optional.of(userVo.getUsername());
        // Optional<String> usernameOptional = Optional.empty();
        String string = usernameOptional.orElse("李四");
        System.err.println(string);
    }
}

使用of()方法创建一个非空的Optional对象,并将赋值后的userName作为值传递给它。然后,我们使用orElse()方法获取Optional对象的值,如果Optional对象为空,则返回指定的默认值"李四"。

当示例中调用的是of()方法时

输出结果:张三

当示例中调用的是empty()方法时

输出结果:李四

orElseGet()方法

如果Optional对象包含值,则返回该值,否则通过调用Supplier接口提供的方法来生成一个默认值。

public class OptionalTest {
    public static void main(String[] args) {
        UserVo userVo = new UserVo();
        // userVo.setUsername("张三");
        Optional<String> usernameOptional = Optional.ofNullable(userVo.getUsername());
        String string = usernameOptional.orElseGet(new Supplier<String>() {
            @Override
            public String get() {
                return "李四";
            }
        });
        System.out.println(string);
    }
}

使用ofNullable()方法创建了一个包含指定值的Optional对象。如果值为null,则创建一个空的Optional对象。然后调用了orElseGet()方法。

运行测试,当userVo正常给userName赋值时

输出结果:张三

没有赋值时

输出结果:李四

orElseThrow()方法

如果Optional对象包含值,则返回该值,否则通过调用Supplier接口提供的方法来抛出指定的异常。

public class OptionalTest {
    public static void main(String[] args) throws Throwable {
        UserVo userVo = new UserVo();
        // userVo.setUsername("张三");
        Optional<String> usernameOptional = Optional.ofNullable(userVo.getUsername());
        String string = usernameOptional.orElseThrow(new Supplier<Throwable>() {
            @Override
            public Throwable get() {
                throw new RuntimeException("抛出指定异常");
            }
        });
        System.err.println(string);
    }
}

userVo正常给userName赋值时

输出结果:张三

没有赋值时

Exception in thread "main" java.lang.RuntimeException: 抛出指定异常
    at com.sun.test.OptionalTest$1.get(OptionalTest.java:16)
    at com.sun.test.OptionalTest$1.get(OptionalTest.java:13)
    at java.util.Optional.orElseThrow(Optional.java:290)
    at com.sun.test.OptionalTest.main(OptionalTest.java:13)​

转换Optional中的值

map()方法

对Optional中的值进行转换,并返回一个新的Optional对象。

public class OptionalTest {
    public static void main(String[] args) throws Throwable {
        UserVo userVo = new UserVo();
        userVo.setUsername("张三");
        Optional<String> usernameOptional = Optional.ofNullable(userVo.getUsername());
        Optional<String> optional = usernameOptional.map(new Function<String, String>() {
            @Override
            public String apply(String s) {
                return s + " -- 值转换";
            }
        });
        System.err.println(optional.get());
    }
}

创建一个包含指定值的Optional对象,如果值为null,则创建一个空的Optional对象,userVo.getUsername()不为空,走后续逻辑,调用map()方法,生成新的Optional对象,最后用get()方法获取Optional中的值。

输出结果:张三 -- 值转换

flatMap()方法

Optional中的值进行转换,并返回一个新的Optional对象。

public class OptionalTest {
    public static void main(String[] args) throws Throwable {
        UserVo userVo = new UserVo();
        userVo.setUsername("张三");
        Optional<String> usernameOptional = Optional.ofNullable(userVo.getUsername());
        Optional<String> optional = usernameOptional.flatMap(new Function<String, Optional<String>>() {
            @Override
            public Optional<String> apply(String s) {
                return Optional.ofNullable(s + " -- 值转换");
            }
        });
        System.err.println(optional.get());
    }
}
输出结果:张三 -- 值转换

输出结果与调用map()一样,且该方法处理逻辑稍复杂一些,map()flatMap()按需选择即可。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实战之小蜜蜂扩音器网上商城系统的实现

    Java实战之小蜜蜂扩音器网上商城系统的实现

    这篇文章主要介绍了如何利用Java实现简单的小蜜蜂扩音器网上商城系统,文中采用到的技术有JSP、Servlet 、JDBC、Ajax等,感兴趣的可以动手试一试
    2022-03-03
  • Mybatis使用collection标签进行树形结构数据查询时携带外部参数查询

    Mybatis使用collection标签进行树形结构数据查询时携带外部参数查询

    这篇文章主要介绍了Mybatis使用collection标签进行树形结构数据查询时携带外部参数查询,需要的朋友可以参考下
    2023-10-10
  • Java下载图片并导出压缩包的实现步骤

    Java下载图片并导出压缩包的实现步骤

    用Java和Vue编写接口来下载网络图片并导出压缩包,首先,我得分解一下这个问题,看看需要哪些步骤,后端用Java处理图片下载和压缩,前端用Vue提供界面和触发下载,本文通过代码示例给大家介绍了Java下载图片并导出压缩包的实现步骤,需要的朋友可以参考下
    2025-08-08
  • Spring Boot 一个注解搞定加密 + 解密 + 签名 + 验签(一文全解)

    Spring Boot 一个注解搞定加密 + 解密 + 签名

    本文介绍了一种基于Spring Boot 3.x的接口安全解决方案,通过自定义注解@ApiSecurity结合AOP切面,实现请求解密、验签、响应加密及加签的自动化处理,_springboot api aop 报文加解密
    2025-09-09
  • springcloud pom.xml完整配置详解

    springcloud pom.xml完整配置详解

    这篇文章主要介绍了springcloud pom.xml完整配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • SpringBoot 的参数配置示例全解析

    SpringBoot 的参数配置示例全解析

    Spring Boot的参数配置系统通过application.properties和application.yml文件实现,支持多种外部配置方式,本文介绍SpringBoot 的参数配置示例全解析,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 使用SpringBoot 配置Oracle和H2双数据源及问题

    使用SpringBoot 配置Oracle和H2双数据源及问题

    这篇文章主要介绍了使用SpringBoot 配置Oracle和H2双数据源及问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java陷阱之assert关键字详解

    Java陷阱之assert关键字详解

    这篇文章详细介绍了Java陷阱之assert关键字,有需要的朋友可以参考一下
    2013-09-09
  • MyBatis查询时属性名和字段名不一致问题的解决方法

    MyBatis查询时属性名和字段名不一致问题的解决方法

    这篇文章主要给大家介绍了关于MyBatis查询时属性名和字段名不一致问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 关于在Java中使用预定义类

    关于在Java中使用预定义类

    这篇文章主要介绍了关于在Java中使用预定义类,预定义类就是Java类库(或第三方库)中已经定义好的类,例如,Math 类和 Date 类,需要的朋友可以参考下
    2023-05-05

最新评论