说明
Java 8 引入了 Optional 类,它是一个容器对象,可以包含一个非空对象或者为空。Optional 类的目的是为了解决空指针异常的问题,使代码更加健壮和优雅。
Optional 类提供了一系列方法来处理包含的对象,常用的方法包括:
ofNullable(T value)
:将一个可能为 null 的对象包装成 Optional 对象。isPresent()
:判断 Optional 对象是否包含非空值。get()
:获取 Optional 对象中的值,如果值为空则抛出 NoSuchElementException 异常。orElse(T other)
:获取 Optional 对象中的值,如果值为空则返回指定的默认值。orElseGet(Supplier<? extends T> other)
:获取 Optional 对象中的值,如果值为空则使用指定的 Supplier 函数生成默认值。orElseThrow(Supplier<? extends X> exceptionSupplier)
:获取 Optional 对象中的值,如果值为空则抛出指定的异常。map(Function<? super T, ? extends U> mapper)
:对 Optional 对象中的值进行映射操作,返回一个新的 Optional 对象。flatMap(Function<? super T, Optional<U>> mapper)
:对 Optional 对象中的值进行映射操作,返回一个新的 Optional 对象,并将结果展开。
示例
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
String name = null;
// 使用 ofNullable 方法包装可能为 null 的对象
Optional<String> optionalName = Optional.ofNullable(name);
// 判断 Optional 对象是否包含非空值
if (optionalName.isPresent()) {
// 获取 Optional 对象中的值
String value = optionalName.get();
System.out.println("Name: " + value);
} else {
System.out.println("Name is empty");
}
// 使用 orElse 方法获取 Optional 对象中的值,如果值为空则返回默认值
String defaultValue = optionalName.orElse("Unknown");
System.out.println("Default Name: " + defaultValue);
// 使用 orElseGet 方法获取 Optional 对象中的值,如果值为空则使用 Supplier 函数生成默认值
String generatedValue = optionalName.orElseGet(() -> generateName());
System.out.println("Generated Name: " + generatedValue);
// 使用 orElseThrow 方法获取 Optional 对象中的值,如果值为空则抛出异常
try {
String result = optionalName.orElseThrow(() -> new RuntimeException("Name is empty"));
System.out.println("Result: " + result);
} catch (RuntimeException e) {
System.out.println(e.getMessage());
}
// 使用 map 方法对 Optional 对象中的值进行映射操作
Optional<String> mappedName = optionalName.map(n -> n.toUpperCase());
if (mappedName.isPresent()) {
String mappedValue = mappedName.get();
System.out.println("Mapped Name: " + mappedValue);
}
// 使用 flatMap 方法对 Optional 对象中的值进行映射操作,并将结果展开
Optional<String> flatMappedName = optionalName.flatMap(n -> Optional.ofNullable(n.toUpperCase()));
if (flatMappedName.isPresent()) {
String flatMappedValue = flatMappedName.get();
System.out.println("Flat Mapped Name: " + flatMappedValue);
}
}
private static String generateName() {
return "Generated";
}
}