Skip to content

Optional

概念

Optional是Java 8引入的一个类,用于解决空指针异常的问题。它可以包装一个可能为空的值,并提供了一些方法来处理这个值。

示例:

java
public class OptionalExample {
    public static void main(String[] args) {
        String str = null;
        
        // 使用ofNullable方法创建一个Optional对象

        Optional<String> optionalStr = Optional.ofNullable(str);
        
        // 使用isPresent方法判断Optional对象是否包含非空值

        if (optionalStr.isPresent()) {
            System.out.println("str的值为:" + optionalStr.get());
        } else {
            System.out.println("str为空");
        }
        
        // 使用orElse方法获取Optional对象中的值,如果为空则返回默认值

        String result = optionalStr.orElse("默认值");
        System.out.println("result的值为:" + result);
        
        // 使用ifPresent方法在Optional对象包含非空值时执行某个操作

        optionalStr.ifPresent(value -> System.out.println("str的长度为:" + value.length()));
    }
}

在上面的示例中,我们首先使用Optional.ofNullable()方法创建了一个Optional对象,然后使用isPresent()方法判断Optional对象是否包含非空值。如果包含非空值,则使用get()方法获取该值;否则,输出"str为空"。

接下来,我们使用orElse()方法获取Optional对象中的值,如果为空则返回默认值。最后,我们使用ifPresent()方法在Optional对象包含非空值时执行某个操作,这里我们输出了字符串的长度。

备注

使用Optional并不是一定比显式地进行空值检查更好。在某些情况下,过度使用Optional可能会导致代码变得复杂和难以理解。因此,在使用Optional时需要根据具体情况进行权衡和选择。

精髓

  • 1、Optional并不是消除了空值错误,而是为了让程序在获取值的时候就判断空指针;

  • 2、Optional使得隐藏性错误(空指针)尽早被发现,避免随着函数调用栈越来越深,风险越来越大。

常用的方法

  • Optional.empty(): 创建一个空的 Optional 实例

  • Optional.of(T t):创建一个 Optional 实例,当 t为null时抛出异常

  • Optional.ofNullable(T t):创建一个 Optional 实例,当t为null时不会抛出异常,而是返回一个空的实例

  • isPresent():判断optional是否为空,如果空则返回false,否则返回true

  • ifPresent(Consumer c):如果optional不为空,则将optional中的对象传给Comsumer函数

  • orElse(T other):如果optional不为空,则返回optional中的对象;如果为null,则返回 other 这个默认值

  • orElseGet(Supplier<T> other):如果optional不为空,则返回optional中的对象;如果为null,则使用Supplier函数生成默认值other

  • orElseThrow(Supplier<X> exception):如果optional不为空,则返回optional中的对象;如果为null,则抛出Supplier函数生成的异常

java
@GetMapping("/name/{name}/with_spu")
    public Theme getThemeByNameWithSpu(@PathVariable(name = "name") String themeName){
        Optional<Theme> optionalTheme = this.themeService.findByName(themeName);
        return optionalTheme.orElseThrow(()-> new NotFoundException(30003));
    }

如有转载或 CV 的请标注本站原文地址