Optional 类的设计是基于函数式编程的思想,它借鉴了 Scala 和 Haskell 等语言中的 Option 类型。Optional 类实现了 java.util.function 包中的 Supplier、Consumer、Predicate、Function 等接口,这使得它可以和 lambda 表达式或者方法引用一起使用,形成更简洁和优雅的代码。
Optional 类被 final 修饰,因此它是一个不可变的类,它有两个静态方法用于创建 Optional 对象
Optional.empty 表示一个空的 Optional 对象,它不包含任何值。
// 创建一个空的 Optional 对象
Optional<String> empty = Optional.empty();
Optional.of 表示一个非空的 Optional 对象,它包含一个非空的值。
// 创建一个非空的 Optional 对象
Optional<String> hello = Optional.of("Hello");
Optional.ofNullable(T value)
注意,如果我们使用 Optional.of 方法传入一个 null 值,会抛出 NullPointerException。如果我们不确定一个值是否为空,可以使用 Optional.ofNullable 方法,它会根据值是否为空,返回一个相应的 Optional 对象。例如:
// 创建一个可能为空的 Optional 对象
Optional<String> name = Optional.ofNullable("Hello");
Optional 对象的使用方法
Optional 对象提供了一些方法,让我们可以更方便地处理可能为空的值,而不需要显式地进行空值检查或者使用 null。以下是一些常用的方法。
isPresent()
判断 Optional 对象是否包含一个非空的值,返回一个布尔值。
get()
如果 Optional 对象包含一个非空的值,返回该值,否则抛出 NoSuchElementException 异常。
// 使用 isPresent 和 get 方法
Optional<String> name = Optional.ofNullable("tom");
if (name.isPresent()) {
System.out.println("Hello, " + name.get());
} else {
System.out.println("Name is not available");
}
// 输出:Hello tom
ifPresent(Consumer<? super T> action)
如果 Optional 对象包含一个非空的值,执行给定的消费者操作,否则什么也不做。
// 使用 ifPresent(Consumer<? super T> action)
Optional<String> name = Optional.ofNullable("tom");
name.ifPresent(s -> {
System.out.println("Hello, " + name.get());
});
// 输出:Hello tom
orElse(T other)
如果 Optional 对象包含一个非空的值,返回该值,否则返回给定的默认值。
// 使用 orElse(T other)
Optional<String> name = Optional.ofNullable(null);
String greeting = "Hello, " + name.orElse("Guest");
System.out.println(greeting);
// 输出:Hello Guest
orElseGet(Supplier<? extends T> supplier)
如果 Optional 对象包含一个非空的值,返回该值,否则返回由给定的供应者操作生成的值。
// 使用 orElseGet(Supplier<? extends T> supplier)
Optional<String> name = Optional.ofNullable(null);
String greeting = "Hello, " + name.orElseGet(() -> "Guset");
System.out.println(greeting);
// 输出:Hello Guset
orElseThrow(Supplier<? extends X> exceptionSupplier)
如果 Optional 对象包含一个非空的值,返回该值,否则抛出由给定的异常供应者操作生成的异常。
// 使用 orElseThrow(Supplier<? extends X> exceptionSupplier)
Optional<String> name = Optional.ofNullable(null);
String greeting = "Hello, " + name.orElseThrow(() -> new NullPointerException("null"));
// 抛出 java.lang.NullPointerException: null 异常
map(Function<? super T,? extends U> mapper)
如果 Optional 对象包含一个非空的值,对该值应用给定的映射函数,返回一个包含映射结果的 Optional 对象,否则返回一个空的 Optional 对象。
// 使用 map(Function<? super T,? extends U> mapper)
Optional<String> name = Optional.ofNullable("tom");
String greeting = "Hello, " + name.map(s -> s.toUpperCase()).get();
System.out.println(greeting);
// 输出:Hello TOM
flatMap(Function<? super T,Optional<U>> mapper)
如果 Optional 对象包含一个非空的值,对该值进行 mapper 参数操作,返回新的 Optional 对象,否则返回一个空的 Optional 对象。
// 使用 flatMap(Function<? super T,Optional<U>> mapper)
Optional<String> name = Optional.ofNullable("tom");
String greeting = name.flatMap(s -> Optional.of("Hello " + s)).get();
System.out.println(greeting);
// 输出:Hello tom
filter(Predicate<? super T> predicate)
如果 Optional 对象包含一个非空的值,并且该值满足给定的谓词条件,返回包含该值的 Optional 对象,否则返回一个空的 Optional 对象。
// filter(Predicate<? super T> predicate)
Optional<String> name = Optional.ofNullable("tom");
String greeting = "Hello " + name.filter(s -> !s.isEmpty()).get();
System.out.println(greeting);
// 输出:Hello tom