Java 8 中引入了一个新的类 Optional,用于解决空指针异常问题。本篇攻略将会详细介绍 Optional 类的使用方法和相关注意事项。
理解 Optional 类
Optional 是一个容器,用于表示一个值存在或不存在的情况。如果某个函数返回一个 Optional 类型的对象,我们就可以判断其是否为空,避免了空指针异常的发生。
Optional 类提供了如下方法:
of
:创建一个包含指定值的 Optional 对象empty
:创建一个空的 Optional 对象ofNullable
:创建一个包含指定值或空值的 Optional 对象isPresent
:判断 Optional 对象是否包含值get
:获取 Optional 对象中的值(如果存在),否则会抛出 NoSuchElementException 异常orElse
:获取 Optional 对象中的值(如果存在),否则返回传入的默认值orElseGet
:获取 Optional 对象中的值(如果存在),否则执行传入的 Supplier 函数并返回函数的返回值orElseThrow
:获取 Optional 对象中的值(如果存在),否则抛出传入的异常
下面我们通过两个示例来说明 Optional 的使用方法。
示例一
在以下代码中,我们使用 Optional 来避免空指针异常的发生。
public String getUserName(Integer id) {
User user = getUserById(id).orElse(null);
if (user != null) {
return user.getName();
}
return "Anonymous";
}
private Optional<User> getUserById(Integer id) {
// 根据 id 从数据库中获取用户信息,如果未找到用户,则返回 Optional.empty()
// 此处省略具体实现
}
首先,我们的 getUserById
函数返回一个 OptionalgetUserName
函数中,我们使用 getUserById(id).orElse(null)
来获取 User 对象。如果 getUserById
返回的 Optional 对象包含一个 User 对象,那么我们就能够通过 user.getName()
获取用户名。否则返回 null,代表用户不存在,我们可以返回 "Anonymous"。
示例二
在以下代码中,我们使用 Optional 来避免多次 null 值判断的发生。
public void processOrder(Order order) {
Optional.ofNullable(order)
.map(Order::getCustomer)
.map(Customer::getEmailAddress)
.ifPresent(email -> sendEmail(email, "Your order has been processed"));
}
private void sendEmail(String email, String content) {
// 发送邮件的具体逻辑,此处省略
}
在 processOrder
函数中,我们使用 Optional.ofNullable
来创建一个 Optionalmap
方法获取 Customer
对象和其 emailAddress
。最后,我们使用 ifPresent
方法来判断 emailAddress
是否存在,如果存在,我们就可以通过调用 sendEmail
方法来发送邮件。
需要注意的是,使用 Optional 并不一定总是比传统的 if-else 判断更好,因此在实际使用中需要根据情况来选择使用 Optional 还是传统的判断方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Optional解决空指针异常总结(java 8 功能) - Python技术站