Bootstrap

Optional类:避免NullPointerException

Optional类是Java 8中引入的一个容器类,用来包含或不包含非null对象。它的设计目的是为了提供一种更清晰、更安全的方式来处理可能为null的对象,从而避免NullPointerException。以下是Optional类的一些关键特性和常用方法:

关键特性:

  1. 非空检查Optional可以用来表示一个值存在或不存在,这比直接返回null更语义化。
  2. 链式调用Optional支持链式调用,可以流畅地进行一系列操作。
  3. 空安全:使用Optional可以避免直接操作null值,减少空指针异常的风险。

常用方法:

of(T value):
创建一个包含值的Optional实例。如果值是null,则抛出NullPointerException。

ofNullable(T value):
创建一个包含值的Optional实例。如果值是null,则返回一个空的Optional。

empty():返回一个空的Optional实例。

isPresent():如果Optional实例中有值存在,则返回true,否则返回false。

ifPresent(Consumer<T> consumer):
如果Optional实例中有值存在,则执行给定的Consumer操作,否则什么也不做。

get():
如果Optional实例中有值存在,则返回该值,否则抛出NoSuchElementException。

orElse(T other):
如果Optional实例中有值存在,则返回该值,否则返回指定的其它值。

orElseGet(Supplier<? extends T> other):
如果Optional实例中有值存在,则返回该值,否则返回由Supplier函数提供的值。

orElseThrow(Supplier<? extends X> exceptionSupplier):
如果Optional实例中有值存在,则返回该值,否则抛出由Supplier函数提供的异常。

map(Function<? super T,? extends U> mapper):
如果Optional实例中有值存在,则将值映射到另一个值,否则返回空的Optional。

flatMap(Function<? super T, Optional<U>> mapper):
如果Optional实例中有值存在,则将值映射到另一个Optional,否则返回空的Optional。

示例代码:

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> optional = Optional.ofNullable(null);

        // 检查值是否存在
        if (optional.isPresent()) {
            System.out.println("Value is present.");
        } else {
            System.out.println("Value is not present.");
        }

        // 使用orElse提供默认值
        String value = optional.orElse("Default Value");
        System.out.println(value);

        // 使用orElseThrow抛出自定义异常
        try {
            String valueOrThrow = optional.orElseThrow(() -> new IllegalArgumentException("No value present"));
            System.out.println(valueOrThrow);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }

        // 使用ifPresent执行操作
        optional.ifPresent(System.out::println);
    }
}

使用Optional可以提高代码的可读性和健壮性,但它并不是解决null问题的万能钥匙。滥用Optional可能会导致代码难以理解和维护,因此应该在适当的时候使用它。

;