Optional
概念
Optional是Java 8引入的一个类,用于解决空指针异常的问题。它可以包装一个可能为空的值,并提供了一些方法来处理这个值。
示例:
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函数生成默认值otherorElseThrow(Supplier<X> exception)
:如果optional不为空,则返回optional中的对象;如果为null,则抛出Supplier函数生成的异常
@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));
}