在 Java 中,Optional
是一个容器类,代表一个可能包含也可能不包含非空值的容器。它是 Java 8 引入的一部分,用于解决可能出现的 NullPointerException
问题,并提供更好的方法来表示方法返回的可能为空的值。Optional
的使用主要集中在以下几个方面:
创建 Optional 对象
-
创建一个空的
Optional
对象:Optional<String> emptyOpt = Optional.empty();
-
根据非空值创建
Optional
对象:String str = "Hello, World!"; Optional<String> strOpt = Optional.of(str);
-
根据可能为空的值创建
Optional
对象:String nullableStr = null; Optional<String> nullableOpt = Optional.ofNullable(nullableStr);
检查 Optional 的值
-
判断是否有值:
if (strOpt.isPresent()) { System.out.println("Value is present"); }
-
如果有值则执行某个操作:
strOpt.ifPresent(value -> System.out.println("Value: " + value));
获取 Optional 的值
-
获取值(可能抛出
NoSuchElementException
):String value = strOpt.get();
-
获取值并提供默认值:
String defaultValue = strOpt.orElse("Default Value");
-
获取值并在值为空时调用指定的函数:
String defaultValue = strOpt.orElseGet(() -> "Default Value from Supplier");
-
获取值并在值为空时抛出指定异常:
String value = strOpt.orElseThrow(() -> new IllegalArgumentException("Value is absent"));
转换 Optional 的值
-
转换值:
Optional<Integer> lengthOpt = strOpt.map(String::length);
-
平坦映射(flatMap):
Optional<Optional<String>> nestedOpt = Optional.of(Optional.of("Nested Value")); Optional<String> flatOpt = nestedOpt.flatMap(opt -> opt);
组合 Optional 的值
- 过滤值:
Optional<String> filteredOpt = strOpt.filter(value -> value.startsWith("Hello"));
例子
以下是一个使用 Optional
的完整例子:
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
// 创建 Optional 对象
Optional<String> strOpt = Optional.of("Hello, World!");
// 检查是否有值
if (strOpt.isPresent()) {
System.out.println("Value is present");
}
// 如果有值则执行某个操作
strOpt.ifPresent(value -> System.out.println("Value: " + value));
// 获取值并提供默认值
String defaultValue = strOpt.orElse("Default Value");
System.out.println("Value or Default: " + defaultValue);
// 转换值
Optional<Integer> lengthOpt = strOpt.map(String::length);
lengthOpt.ifPresent(length -> System.out.println("Length: " + length));
}
}
通过 Optional
,可以更优雅地处理可能为空的值,避免大量的空值检查,从而使代码更简洁和易读。