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
}
相关推荐
默_笙2 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003962 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技2 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时2 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊2 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1232 天前
2026年第38周GitHub趋势周报
python·科技·github