一、特性
- 创建Optional对象:
// 创建了包含非null值的 Optional 对象
Optional<String> optionalString = Optional.of("Hello, Optional!");
// 创建一个不包含任何值的空 Optional 对象
Optional<String> emptyOptional = Optional.empty();
// 创建一个包含指定值的 Optional 对象,如果指定的值为 null,则创建一个空的 Optional 对象:
Optional<String> nullableOptional = Optional.ofNullable(T value);
- 判断是否有值:
if (optionalString.isPresent()) {
System.out.println("Value is present: " + optionalString.get());
} else {
System.out.println("Value is absent.");
}
- 如果有值则执行操作,否则执行默认操作:
String result = optionalString.orElse("Default Value");
System.out.println("Result: " + result);
- 如果有值则执行操作:
optionalString.ifPresent(value -> System.out.println("Value is present: " + value));
- 获取值,或者如果没有值则抛出异常:
String value = optionalString.orElseThrow(() -> new IllegalStateException("Value is absent"));
System.out.println("Value: " + value);
- 如果有值满足条件则执行操作:
optionalString.filter(s -> s.contains("Optional"))
.ifPresent(filteredValue -> System.out.println("Filtered Value: " + filteredValue));
- 对值进行转换:
Optional<Integer> lengthOptional = optionalString.map(String::length);
lengthOptional.ifPresent(length -> System.out.println("Length: " + length));
- 如果有值,则应用函数并返回新的Optional:
Optional<String> upperCaseOptional = optionalString.map(String::toUpperCase);
upperCaseOptional.ifPresent(upperCaseValue -> System.out.println("Upper Case Value: " + upperCaseValue));
- 如果有值,则应用函数返回新的Optional,然后将结果展平(flat map):
Optional<String> flatMappedOptional = optionalString.flatMap(value -> Optional.of(value + " - FlatMapped"));
flatMappedOptional.ifPresent(flatMappedValue -> System.out.println("Flat Mapped Value: " + flatMappedValue));
二、解决问题
Optional
是为了解决空指针异常(NullPointerException)问题而引入的。在Java中,当我们尝试访问一个对象的属性或调用其方法时,如果该对象为 null
,就会抛出空指针异常。Optional
旨在提供一种更安全、更清晰的方式来处理可能为 null
的值,从而减少空指针异常的发生。
以下是 Optional
的一些优点和解决的问题:
-
避免空指针异常:
Optional
提供了一种方式来明确表示一个值可能为空,而不是使用null
,从而减少了因为空指针异常而引起的程序崩溃的可能性。 -
更清晰的代码:
使用Optional
可以使代码更清晰和表达意图,因为它强调了一个值可能为空的情况,并迫使程序员在代码中显式处理这种情况。 -
链式调用:
Optional
提供了一组方法,允许进行链式调用,使得代码更加流畅和易读。
以下是一个简单的案例,说明 Optional
如何帮助解决空指针异常问题:
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
// 使用传统方式可能引发空指针异常
String result = getUserNameLengthLegacy(null);
System.out.println("Legacy result: " + result);
// 使用Optional避免空指针异常
Optional<String> optionalUserName = Optional.ofNullable(null);
String resultOptional = optionalUserName.map(String::length).orElse(-1).toString();
System.out.println("Optional result: " + resultOptional);
}
// 传统方式可能引发空指针异常
private static String getUserNameLengthLegacy(String userName) {
return userName.length() + ""; // 可能引发空指针异常
}
}
在上述示例中,getUserNameLengthLegacy
方法接受一个用户名,并尝试获取其长度。如果传入 null
,将抛出空指针异常。相比之下,使用 Optional
的方式能够更加安全地处理可能为 null
的情况,避免了潜在的空指针异常。