Java 1.8 Optional 杜绝空指针异常

更新时间 2023-07-21 10:32:04

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 255 小节,累计 39w+ 字,讲解图:1716 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1300+ 小伙伴加入,欢迎点击围观

在 Java 1.8 中,Optional 是一个用于处理可能为 null 的值的容器类。它提供了一种优雅的方式来避免空指针异常,并且可以用于优雅地处理可能为空的对象。

本教程将深入介绍 Java 1.8 中的 Optional 类,并通过示例代码演示如何使用它。

Optional 类概览

java.util 包中,Optional 类定义如下:

public final class Optional<T> {
    // 构造函数、静态工厂方法和其他方法
}

Optional 是一个泛型类,它可以包装任意类型的值。

创建 Optional 对象

你可以使用以下方法来创建 Optional 对象:

1. of() 方法

Optional<String> optionalValue = Optional.of("Hello, World!");

使用 of() 方法创建一个非空的 Optional 对象,如果传入的值为 null,则会立即抛出 NullPointerException

2. ofNullable() 方法

Optional<String> optionalValue = Optional.ofNullable(null);

使用 ofNullable() 方法创建一个 Optional 对象,如果传入的值为 null,则会创建一个空的 Optional 对象。

3. empty() 方法

Optional<String> optionalValue = Optional.empty();

使用 empty() 方法创建一个空的 Optional 对象,表示该 Optional 对象没有值。

使用 Optional 对象

Optional 提供了一系列方法来处理可能为 null 的值。

1. isPresent() 方法

Optional<String> optionalValue = Optional.of("Hello, World!");
if (optionalValue.isPresent()) {
    System.out.println("Value is present: " + optionalValue.get());
} else {
    System.out.println("Value is not present.");
}

isPresent() 方法用于判断 Optional 对象是否包含值。如果包含值,则返回 true,否则返回 false

2. ifPresent() 方法

Optional<String> optionalValue = Optional.of("Hello, World!");
optionalValue.ifPresent(value -> System.out.println("Value is present: " + value));

ifPresent() 方法用于在 Optional 对象包含值的情况下执行给定的操作。如果 Optional 包含值,则会执行 Lambda 表达式,否则不会执行任何操作。

3. orElse() 方法

Optional<String> optionalValue = Optional.empty();
String result = optionalValue.orElse("Default Value");
System.out.println("Result: " + result);

orElse() 方法用于获取 Optional 对象的值。如果 Optional 对象包含值,则返回该值,否则返回传入的默认值。

4. orElseGet() 方法

javaCopy codeOptional<String> optionalValue = Optional.empty();
String result = optionalValue.orElseGet(() -> "Default Value");
System.out.println("Result: " + result);

orElseGet() 方法与 orElse() 方法类似,但传入的参数是一个 Supplier 函数 ,可以用于生成默认值。

5. orElseThrow() 方法

Optional<String> optionalValue = Optional.empty();
String result = optionalValue.orElseThrow(() -> new IllegalArgumentException("Value not present"));
System.out.println("Result: " + result);

orElseThrow() 方法用于在 Optional 对象为空时抛出异常。如果 Optional 包含值,则返回该值,否则抛出指定的异常。

链式调用

Optional 还支持链式调用,可以在一系列操作中依次处理 Optional 对象。

Optional<String> optionalValue = Optional.of("Hello, World!");
optionalValue.map(String::toUpperCase).ifPresent(value -> System.out.println("Uppercase value: " + value));

在这个例子中,我们使用 map() 方法将值转换为大写形式,并使用 ifPresent() 方法在 Optional 对象包含值时打印大写的结果。

总结

Java 1.8 中的 Optional 类为处理可能为 null 的值提供了优雅的解决方案。通过使用 Optional,我们可以避免空指针异常,并且可以更加优雅地处理可能为空的对象。