Optional类有什么作用?
Optional 是 Java 8 引入的一个容器类,旨在解决 null 引发的常见问题,特别是 NullPointerException(空指针异常)。它主要的作用是表示一个值可能存在,也可能不存在,能够更安全、明确地处理空值,而不是直接使用 null。
Optional 的作用
Optional 主要有以下几个作用:
- 避免
NullPointerException:
传统上,当一个方法返回null时,调用者需要在代码中处理null,以避免空指针异常。而Optional类通过明确表示返回值可能为空,避免了NullPointerException的问题。 - 明确表达值可能不存在的场景:
Optional提供了一种表达某个值“可能不存在”的方式,避免了null值的模糊性。通过Optional,你可以明确地表达“返回值可能为空”的意图。 - 函数式编程支持:
Optional为流操作提供了支持,能够方便地进行链式调用,尤其是在流处理中,可以使用map()、flatMap()、filter()等函数式方法,增强了代码的可读性和表达性。 - 替代传统的
null检查:
Optional提供了很多方法(如ifPresent()、orElse()、orElseGet())来替代显式的null检查,从而让代码更加简洁、优雅。
Optional 的常用方法
以下是 Optional 常见的几种方法,展示了它是如何帮助我们避免 null 的常见操作:
1. Optional.of(T value):
- 用于包装一个非
null的值。如果传入的是null,则会抛出NullPointerException。
Optional<String> optional = Optional.of("Hello");
optional.ifPresent(System.out::println); // 输出: Hello2. Optional.ofNullable(T value):
- 用于包装一个可能为
null的值。如果值为null,则返回一个空的Optional对象(即Optional.empty())。
Optional<String> optional1 = Optional.ofNullable("Hello");
Optional<String> optional2 = Optional.ofNullable(null);
optional1.ifPresent(System.out::println); // 输出: Hello
optional2.ifPresent(System.out::println); // 不输出3. Optional.empty():
- 返回一个空的
Optional对象,表示没有值。
Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.isPresent()); // 输出: false4. isPresent():
- 检查
Optional中是否有值。返回true如果值存在,false如果没有值。
Optional<String> optional = Optional.of("Hello");
System.out.println(optional.isPresent()); // 输出: true
Optional<String> empty = Optional.empty();
System.out.println(empty.isPresent()); // 输出: false5. ifPresent(Consumer<? super T> action):
- 如果
Optional中有值,则执行给定的action。如果没有值,则什么都不做。
Optional<String> optional = Optional.of("Hello");
optional.ifPresent(System.out::println); // 输出: Hello
Optional<String> empty = Optional.empty();
empty.ifPresent(System.out::println); // 不输出6. orElse(T other):
- 如果
Optional中有值,返回该值;如果没有值,返回提供的默认值other。
Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional.orElse("Default Value")); // 输出: Default Value7. orElseGet(Supplier<? extends T> other):
- 如果
Optional中有值,返回该值;如果没有值,调用提供的Supplier函数并返回其结果。orElseGet更灵活,因为它延迟了默认值的计算。
Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional.orElseGet(() -> "Generated Default Value")); // 输出: Generated Default Value8. orElseThrow():
- 如果
Optional中有值,返回该值;如果没有值,抛出NoSuchElementException异常(或者可以抛出自定义异常)。
Optional<String> optional = Optional.ofNullable(null);
try {
String value = optional.orElseThrow();
} catch (NoSuchElementException e) {
System.out.println(e.getMessage()); // 输出: No value present
}9. map(Function<? super T, ? extends U> mapper):
- 如果
Optional中有值,应用给定的映射函数并返回一个新的Optional;如果没有值,返回一个空的Optional。
Optional<String> optional = Optional.of("Hello");
Optional<String> upperCaseOptional = optional.map(String::toUpperCase);
upperCaseOptional.ifPresent(System.out::println); // 输出: HELLO10. flatMap(Function<? super T, Optional<U>> mapper):
- 类似于
map,但是返回的结果是一个Optional,如果结果是Optional.empty(),则不会继续进行链式操作。
Optional<String> optional = Optional.of("Hello");
Optional<Integer> lengthOptional = optional.flatMap(s -> Optional.of(s.length()));
lengthOptional.ifPresent(System.out::println); // 输出: 5Optional 使用场景
- 返回值可能为空的情况:在方法返回值可能为空时,使用
Optional来明确表示该值可能存在,也可能不存在,避免直接返回null。
例如,数据库查询结果可能没有数据时,可以返回 Optional.empty(),而不是返回 null。
- 避免
null引起的错误:使用Optional可以明确避免空指针异常,调用者知道如何安全地处理空值。 - 链式调用:
Optional使得函数式编程变得更容易,特别是在进行流处理时,链式调用可以避免大量的null检查。
总结
Optional 是一种容器类,旨在避免 null 引发的空指针异常,通过明确表示值的存在与否,帮助我们编写更安全、更清晰的代码。它提供了很多方法来处理 null,并支持链式操作,从而增强了代码的可读性和表达能力。
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »