Java 的 Optional 类是一种容器对象,包含了可能是或不是非空值的值。它主要用于减少代码中的 null 检查和 NullPointerException 的风险。Optional 类在 Java 8 中引入,位于 java.util 包中。
以下是关于 Optional 的一些重要方法和使用示例:
创建 Optional 对象
-
使用
of方法:Optional<String> optional = Optional.of("Hello");如果传递给
of方法的值为null,则会抛出NullPointerException。 -
使用
ofNullable方法:Optional<String> optional = Optional.ofNullable(null);ofNullable方法允许传递null值,并创建一个空的Optional对象。 -
使用
empty方法:Optional<String> optional = Optional.empty();这将创建一个明确的空
Optional对象。
检查 Optional 的值
-
使用
isPresent方法:if (optional.isPresent()) { System.out.println("Value is present"); } -
使用
ifPresent方法:optional.ifPresent(value -> System.out.println("Value: " + value));如果值存在,
ifPresent方法会执行传递的Consumer函数。
获取 Optional 的值
-
使用
get方法:String value = optional.get();如果值不存在,调用
get方法会抛出NoSuchElementException。 -
使用
orElse方法:String value = optional.orElse("Default Value");如果值不存在,返回默认值。
-
使用
orElseGet方法:String value = optional.orElseGet(() -> "Default Value");orElseGet方法与orElse类似,但接受一个Supplier函数。 -
使用
orElseThrow方法:String value = optional.orElseThrow(() -> new IllegalArgumentException("Value is missing"));如果值不存在,
orElseThrow方法会抛出指定的异常。
转换 Optional 的值
-
使用
map方法:Optional<Integer> lengthOptional = optional.map(String::length);map方法会应用传递的函数并返回一个新的Optional。 -
使用
flatMap方法:Optional<Integer> lengthOptional = optional.flatMap(value -> Optional.of(value.length()));flatMap方法与map类似,但它会直接返回嵌套的Optional对象。
示例代码
以下是一个综合示例,展示了 Optional 的一些常见用法:
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optional = Optional.ofNullable("Hello");
// 检查值是否存在
if (optional.isPresent()) {
System.out.println("Value is present: " + optional.get());
}
// 使用 ifPresent
optional.ifPresent(value -> System.out.println("Value: " + value));
// 获取值,使用默认值
String value1 = optional.orElse("Default Value");
System.out.println("Value1: " + value1);
// 获取值,使用 Supplier
String value2 = optional.orElseGet(() -> "Default Value");
System.out.println("Value2: " + value2);
// 获取值,抛出异常
try {
String value3 = optional.orElseThrow(() -> new IllegalArgumentException("Value is missing"));
System.out.println("Value3: " + value3);
} catch (Exception e) {
e.printStackTrace();
}
// 转换值
Optional<Integer> lengthOptional = optional.map(String::length);
lengthOptional.ifPresent(length -> System.out.println("Length: " + length));
// 平展 Optional
Optional<Integer> flatMappedLengthOptional = optional.flatMap(value -> Optional.of(value.length()));
flatMappedLengthOptional.ifPresent(length -> System.out.println("FlatMapped Length: " + length));
}
}
Optional 类的引入大大增强了代码的可读性和安全性,减少了空指针异常的风险。在日常编程中合理使用 Optional 可以让代码更加健壮。
本文使用 文章同步助手 同步