Java Optional 的使用
Optional 是 Java 8 引入的容器类,用于表示可能为 null 的值。理解 Optional 的使用可以避免 NullPointerException,使代码更加安全。本章将详细介绍 Java 中的 Optional。
Optional 创建与常用方法
创建 Optional
import java.util.Optional;
// 创建空的 Optional
Optional<String> empty = Optional.empty();
// 创建非空的 Optional
Optional<String> nonEmpty = Optional.of("Hello");
// 创建可能为 null 的 Optional
String value = null;
Optional<String> nullable = Optional.ofNullable(value); // Optional.empty()
String value2 = "Hello";
Optional<String> nullable2 = Optional.ofNullable(value2); // Optional["Hello"]
常用方法
Optional<String> optional = Optional.of("Hello");
// 判断是否有值
boolean isPresent = optional.isPresent(); // true
// 获取值(如果为空抛出异常)
String value = optional.get(); // "Hello"
// 如果为空返回默认值
String result = optional.orElse("默认值"); // "Hello"
String result2 = Optional.empty().orElse("默认值"); // "默认值"
// 如果为空使用 Supplier 提供默认值
String result3 = optional.orElseGet(() -> "默认值");
// 如果为空抛出异常
String result4 = optional.orElseThrow(); // 如果为空抛出 NoSuchElementException
String result5 = optional.orElseThrow(() -> new RuntimeException("值为空"));
避免 NullPointerException
传统方式的问题
// ❌ 传统方式:容易产生 NullPointerException
public String getUserName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName().toUpperCase();
}
}
return "未知";
}
使用 Optional
// ✅ 使用 Optional:更安全
public String getUserName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.map(String::toUpperCase)
.orElse("未知");
}
实际示例
import java.util.Optional;
public class OptionalExample {
// 传统方式
public static String getCityTraditional(User user) {
if (user != null) {
Address address = user.getAddress();
if (address != null) {
return address.getCity();
}
}
return "未知城市";
}
// Optional 方式
public static String getCityOptional(User user) {
return Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("未知城市");
}
}
class User {
private Address address;
public Address getAddress() { return address; }
}
class Address {
private String city;
public String getCity() { return city; }
}