螺竹编程
发布于 2024-08-04 / 5 阅读
0

Java函数/函数式编程:Optional介绍

简介

Optional是Java 8引入的一个新的类,它的目的是解决null引用问题。这个问题在Java编程中很常见,当我们试图访问一个为null的对象时,就会抛出NullPointerException。Optional类提供了一种更优雅和安全的方式来处理这种情况。

主要特点

Optional类的主要特点包括:

  1. 封装一个可能为null的值。 Optional实例可能包含一个非null的值(在这种情况下,我们称之为"存在"值),也可能为空(在这种情况下,我们称之为"不存在"值)。

  2. 提供了各种方法来检查值是否存在,以及在值存在时如何访问和操作它。这些方法包括isPresent()、get()、orElse()、orElseGet()等。

  3. 鼓励编程人员明确考虑null情况,而不是隐式地假设值不会为null。这有助于编写更加健壮和可维护的代码。

  4. 支持函数式编程风格,可以将Optional实例作为方法返回值,并在下游使用流畅的API进行进一步处理。

各种方法

Optional类中的各种常用方法,及其简单示例。

  1. ​of(T value)​:

    • 用于创建一个包含非null值的Optional实例。

    • 如果value为null,将抛出NullPointerException。

    • 示例: Optional<String> name = Optional.of("John Doe");​

  2. ​ofNullable(T value)​:

    • 用于创建一个可能包含null值的Optional实例。

    • 如果value为null,将创建一个空的Optional实例。

    • 示例: Optional<String> name = Optional.ofNullable(null);​

  3. ​isPresent()​:

    • 用于检查Optional实例是否包含值(即不是空的)。

    • 返回true表示包含值,返回false表示为空。

    • 示例: if (name.isPresent()) { System.out.println(name.get()); }​

  4. ​get()​:

    • 用于获取Optional实例包含的值。

    • 如果Optional为空,在调用get()时将抛出NoSuchElementException。

    • 示例: String value = name.get();​

  5. ​orElse(T other)​:

    • 用于在Optional为空时返回一个备用值。

    • 如果Optional包含值,则返回该值,否则返回other。

    • 示例: String value = name.orElse("Default");​

  6. ​orElseGet(Supplier<? extends T> other)​:

    • 用于在Optional为空时通过Supplier函数获取一个备用值。

    • 如果Optional包含值,则返回该值,否则返回other函数返回的值。

    • 示例: String value = name.orElseGet(() -> "Default");​

  7. ​map(Function<? super T,? extends U> mapper)​:

    • 用于在Optional实例上应用一个函数,并返回一个新的Optional实例。

    • 如果原Optional为空,则返回一个新的空Optional实例。

    • 示例: Optional<Integer> length = name.map(String::length);​

  8. ​flatMap(Function<? super T,Optional<U>> mapper)​:

    • 用于在Optional实例上应用一个返回Optional的函数,并返回一个新的Optional实例。

    • 如果原Optional为空,或者mapper函数返回一个空的Optional,则返回一个新的空Optional实例。

    • 示例: Optional<String> upperName = name.flatMap(n -> Optional.of(n.toUpperCase()));​

这些是Optional类中最常用的方法。通过这些方法,我们可以更安全、更优雅地处理可能为null的值,编写出更加健壮和可维护的代码。

简单示例

String name = "John Doe";
Optional<String> nameOptional = Optional.ofNullable(name);

if (nameOptional.isPresent()) {
    System.out.println("Name is present: " + nameOptional.get());
} else {
    System.out.println("Name is not present");
}