共计 3537 个字符,预计需要花费 9 分钟才能阅读完成。
Optional 类是 Java 8 中引入的一个用于避免空指针异常的工具类,请注意它是 java.util
包下的一个工具类。
它提供了一系列方法,用于对可能为 null 的对象进行操作,以便更加安全地访问对象的属性和方法。
Optional 里面几乎全部都围绕其中的一个成员变量 value 在运作。
下面是 Optional 类中常用的方法及其用法:
- of 方法
创建一个包含指定对象的 Optional 对象,如果指定对象为 null,则抛出 NullPointerException 异常。
String str = "Hello, world!"; | |
Optional<String> opt = Optional.of(str); |
- ofNullable 方法
创建一个包含指定对象的 Optional 对象,如果指定对象为 null,则返回一个空的 Optional 对象。
String str = null; | |
Optional<String> opt = Optional.ofNullable(str); |
- empty 方法
创建一个空的 Optional 对象。
Optional<String> opt = Optional.empty();
- get 方法
获取 Optional 对象中的值,如果对象为空,则抛出 NoSuchElementException 异常。
Optional<String> opt = Optional.of("Hello, world!"); | |
String str = opt.get(); |
- isPresent 方法
判断 Optional 对象中是否包含非 null 的值。
Optional<String> opt = Optional.of("Hello, world!"); | |
if (opt.isPresent()) { | |
System.out.println(opt.get()); // 输出:Hello, world! | |
} |
- orElse 方法
获取 Optional 对象中的值,如果对象为空,则返回指定的默认值。
Optional<String> opt1 = Optional.ofNullable(null); | |
String str1 = opt1.orElse("default value"); | |
System.out.println(str1); // 输出:default value | |
Optional<String> opt2 = Optional.of("Hello, world!"); | |
String str2 = opt2.orElse("default value"); | |
System.out.println(str2); // 输出:Hello, world! |
- orElseGet 方法
获取 Optional 对象中的值,如果对象为空,则使用指定的 Supplier 函数生成一个默认值。
Optional<String> opt1 = Optional.ofNullable(null); | |
String str1 = opt1.orElseGet(() -> "default value"); | |
System.out.println(str1); // 输出:default value | |
Optional<String> opt2 = Optional.of("Hello, world!"); | |
String str2 = opt2.orElseGet(() -> "default value"); | |
System.out.println(str2); // 输出:Hello, world! |
- orElseThrow 方法
获取 Optional 对象中的值,如果对象为空,则抛出指定的异常。
Optional<String> opt1 = Optional.ofNullable(null); | |
String str1 = opt1.orElseThrow(() -> new RuntimeException("Object is null")); // 运行抛出异常 | |
Optional<String> opt2 = Optional.of("Hello, world!"); | |
String str2 = opt2.orElseThrow(() -> new RuntimeException("Object is null")); |
- ifPresent 方法
上面提到过 ifPresent 方法,这个方法是重载方法,需要传递一个Consumer 接口的实现类进去。如果 Optional 对象中包含非 null 的值,则执行指定的操作。
Consumer 接口是 Java 8 中引入的一个函数式接口,它表示一个接受单个输入参数并且不返回任何结果的操作。它定义了一个名为 accept 的抽象方法,用于执行操作。Consumer 接口常常用于对集合或流中的元素进行迭代,并对它们进行特定的处理,比如打印、修改或过滤等。
Optional<String> opt = Optional.of("Hello, world!"); | |
opt.ifPresent(System.out::println); // 输出:Hello, world! |
源码中可以看见,判读值不为空则执行传递进来的函数。
public void ifPresent(Consumer<? super T> consumer) { | |
if (value != null) | |
consumer.accept(value); | |
} |
- filter 方法
该方法接收一个 Predicate 接口的实现类,对 Optional 对象中的值进行过滤,返回一个新的 Optional 对象。
Predicate 接口是 Java 8 中引入的一个函数式接口,它表示一个能够接受一个输入参数并返回一个布尔值的操作。Predicate 接口定义了一个名为 test 的抽象方法,用于执行操作。test 方法接受一个泛型参数 T,表示要测试的对象,返回一个布尔值表示测试结果。
Optional<String> opt1 = Optional.of("Hello, world!"); | |
Optional<String> opt2 = opt1.filter(s -> s.contains("o")); |
源码中可以看见如果 test 方法返回为 true,则返回自身,否则返回一个空的 Optional。
public Optional<T> filter(Predicate<? super T> predicate) { | |
Objects.requireNonNull(predicate); | |
if (!isPresent()) | |
return this; | |
else | |
return predicate.test(value) ? this : empty(); | |
} |
- map 方法
该方法接收一个 Function 接口的实现类,对 Optional 对象中的值进行映射,返回一个新的 Optional 对象。
Function 接口是 Java 8 中引入的一个函数式接口,它表示一个能够接受一个输入参数并返回一个结果的操作。Function 接口定义了一个名为 apply 的抽象方法,用于执行操作。apply 方法接受一个泛型参数 T,表示输入参数的类型,返回一个泛型参数 R,表示操作的结果类型。
Optional<String> opt1 = Optional.of("Hello, world!"); | |
Optional<Integer> opt2 = opt1.map(String::length); | |
System.out.println(opt2.get()); // 输出:13 |
源码中可以看见,将函数的返回值赋值给了 ofNullable 方法,而这个方法会返回一个 新的 Optional 对象,所以这也是什么 Optional 的泛型指定可以改变的原因。
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { | |
Objects.requireNonNull(mapper); | |
if (!isPresent()) | |
return empty(); | |
else { | |
return Optional.ofNullable(mapper.apply(value)); | |
} | |
} | |
public static <T> Optional<T> ofNullable(T value) { | |
return value == null ? empty() : of(value); | |
} | |
public static <T> Optional<T> of(T value) { | |
return new Optional<>(value); | |
} |
- flatMap 方法
flatMap 方法也受一个函数作为参数,该函数定义了如何将 Optional 对象中的值进行转换,但是该函数返回值必须是另一个 Optional 对象。
Optional<String> opt1 = Optional.of("Hello, world!"); | |
Optional<Integer> opt2 = opt1.flatMap(s -> Optional.of(s.length())); |
提醒:本文发布于696天前,文中所关联的信息可能已发生改变,请知悉!