Java8 - Optional 处理可能为空值的容器类

1. 创建一个 Optional 对象

Optional.of、Optional.ofNullable 、Optional.empty是Optional类的三个静态方法,用于创建Optional对象。

1. Optional.of 方法

Optional.of 方法用于创建一个包含非空值的Optional对象,如果传入的值为null,则会抛出NullPointerException异常。

java 复制代码
@Test
public void test0() {
    Optional<String> optional = Optional.of("zhangsan");
    Optional<String> optional1 = Optional.of(null); // java.lang.NullPointerException
}
2. Optional.empty 方法

Optional.empty 方法用于创建一个空的Optional对象,该方法不接受任何参数,直接返回一个空的Optional对象。

java 复制代码
@Test
public void test0() {
    Optional<String> optional = Optional.empty();
}
3. Optional.ofNullable 方法

Optional.ofNullable 方法用于创建一个可能为空的Optional对象,如果传入的值为null,则会创建一个空的Optional对象。

java 复制代码
@Test
public void test0() {
    Optional<String> optional = Optional.ofNullable(null);
}

使用Optional.of方法时,需要确保传入的值不为null,否则会抛出异常。而使用Optional.ofNullable方法时,可以接受null值,并创建一个空的Optional对象。Optional.empty方法直接返回一个空的Optional对象,不包含任何值。

如果确定值不会为null,可以使用Optional.of方法;如果值可能为null,则可以使用Optional.ofNullable方法来避免空指针异常;如果需要创建一个空的Optional对象,可以使用Optional.empty方法。

2. optional.isPresen 方法

Optional.isPresent方法是Optional类的一个实例方法,用于判断Optional对象是否包含非空值,如果Optional对象包含非空值,则isPresent方法返回true;如果Optional对象为空,则返回false。

java 复制代码
@Test
public void test0() {
    Optional<String> optional = Optional.of("zhangsan");
    boolean present = optional.isPresent(); // true

    Optional<String> optional1 = Optional.ofNullable(null);
    boolean present1 = optional1.isPresent();

    System.out.println(present); // true
    System.out.println(present1); // false
}

通常,在使用Optional对象之前,可以先使用isPresent方法进行判断,以避免在获取值之前出现空指针异常。

3. optional.get 方法

Optional.get方法是Optional类的一个实例方法,用于获取Optional对象中的非空值。如果Optional对象包含非空值,则get方法返回该值;如果Optional对象为空,则会抛出NoSuchElementException异常。

java 复制代码
@Test
public void test0() {
    Optional<String> optional = Optional.of("zhangsan");
    if(optional.isPresent()){
        optional.get(); // "zhangsan"
    }

    Optional<Object> optional1 = Optional.ofNullable(null);
    optional1.get(); // java.util.NoSuchElementException: No value present
}

需要注意的是,在调用get方法之前,最好先使用isPresent方法进行判断,以确保Optional对象中存在非空值。否则,如果Optional对象为空,调用get方法将会抛出异常。

4. Optional对象为空时返回一个默认值

如果你希望在Optional对象为空时返回一个默认值,可以考虑使用orElse、orElseGet或orElseThrow方法,而不是直接使用get方法。

1. optional.orElse 方法

获取Optional对象中的非空值,如果Optional为空,则返回默认值

java 复制代码
@Test
public void test0() {
    Optional<String> optional1 = Optional.of("zhangsan");
    if(optional1.isPresent()){
        String value1 = optional1.get();
        System.out.println(value1); // "zhangsan"
    }

    Optional<Object> optional2 = Optional.empty();
    Object value2 = optional2.orElse("default");
    System.out.println(value2); // "default"

    Optional<Object> optional3 = Optional.ofNullable(null);
    Object value3 = optional3.orElse("default");
    System.out.println(value3); // "default"
}
2. optional.orElseThrow 方法

获取Optional对象中的非空值,如果Optional为空,则抛出指定的异常

java 复制代码
@Test
public void test0() {
    Optional<Object> optional = Optional.ofNullable(null);
    optional.orElseThrow(() -> new RuntimeException("Value not present")); // java.lang.RuntimeException: Value not present
}
相关推荐
Yurko131 分钟前
【C语言】环境安装(图文)与介绍
c语言·开发语言·学习
仲星(._.)3 分钟前
C语言:字符函数和字符串函数
c语言·开发语言
kyle~4 分钟前
C++---向上取整
开发语言·c++
QX_hao10 分钟前
【Go】--扩容机制
开发语言·golang
weixin_3077791312 分钟前
Clickhouse导出库的表、视图、用户和角色定义的SQL语句
开发语言·数据库·算法·clickhouse·自动化
程序员三藏12 分钟前
银行测试:第三方支付平台业务流,功能/性能/安全测试方法
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·安全性测试
程序员晚枫21 分钟前
Python版本进化史:从3.6到3.14,每个版本都带来了什么惊喜?
python
流星白龙24 分钟前
【Qt】7.信号和槽_connect函数用法(1)
开发语言·数据库·qt
程序猿小D39 分钟前
【完整源码+数据集+部署教程】 【零售和消费品&存货】【无人零售】自动售卖机饮料检测系统源码&数据集全套:改进yolo11-KernelWarehouse
python·yolo·计算机视觉·目标跟踪·数据集·yolo11·自动售卖机饮料检测系统
小龙报40 分钟前
《算法通关指南---C++编程篇(1)》
开发语言·c++·程序人生·算法·学习方法·visual studio