likes
comments
collection
share

解锁Java8 - Optional 类的奥秘:让你的开发变得更加安全

作者站长头像
站长
· 阅读数 20

说明

Optional类是Java 8中引入的一个类,用来表示一个值存在或不存在的情况。它被设计用于解决空指针异常问题,因为在Java中,当一个变量引用为null时,调用该变量上的方法会导致空指针异常。Optional类提供了一种简单而安全的方法来检查是否存在值,避免了空指针异常的出现。

Optional类的使用非常简单。一个Optional对象可以包含一个值,也可以为空。如果Optional对象包含一个值,则调用get()方法将返回该值。如果Optional对象为空,则调用get()方法将抛出NoSuchElementException异常。为了避免这种情况,可以使用isPresent()方法先检查Optional对象是否为空。

Optional类提供了许多方法来操作Optional对象。以下是一些常用的方法:

  • of():创建一个包含指定值的Optional对象。
  • ofNullable():创建一个包含指定值的Optional对象,如果值为null,则创建一个空Optional对象。
  • isPresent():检查Optional对象是否包含值。
  • get():如果Optional对象包含值,则返回该值;否则抛出NoSuchElementException异常。
  • orElse():如果Optional对象为空,则返回一个默认值。
  • orElseGet():如果Optional对象为空,则使用一个Supplier函数生成一个默认值。
  • map():对Optional对象中的值进行操作,并返回一个新的Optional对象。
  • flatMap():对Optional对象中的值进行操作,并返回一个新的Optional对象。

例子

  1. of():创建一个包含指定值的Optional对象。
Optional<String> optional = Optional.of("Hello, World!");
  1. ofNullable():创建一个包含指定值的Optional对象,如果值为null,则创建一个空Optional对象。
String str = null;
Optional<String> optional = Optional.ofNullable(str);
  1. isPresent():检查Optional对象是否包含值。
Optional<String> optional = Optional.of("Hello, World!");
if (optional.isPresent()) {
    System.out.println(optional.get());
}
  1. get():如果Optional对象包含值,则返回该值;否则抛出NoSuchElementException异常。
Optional<String> optional = Optional.of("Hello, World!");
String str = optional.get();
System.out.println(str);
  1. orElse():如果Optional对象为空,则返回一个默认值。
String str = null;
String defaultStr = "Hello, World!";
String result = Optional.ofNullable(str).orElse(defaultStr);
System.out.println(result);
  1. orElseGet():如果Optional对象为空,则使用一个Supplier函数生成一个默认值。
String str = null;
Supplier<String> supplier = () -> "Hello, World!";
String result = Optional.ofNullable(str).orElseGet(supplier);
System.out.println(result);
  1. map():对Optional对象中的值进行操作,并返回一个新的Optional对象。
Optional<String> optional = Optional.of("Hello, World!");
Optional<String> newOptional = optional.map(str -> str.toUpperCase());
System.out.println(newOptional.get());
  1. flatMap():对Optional对象中的值进行操作,并返回一个新的Optional对象。
Optional<String> optional = Optional.of("Hello, World!");
Optional<String> newOptional = optional.flatMap(str -> Optional.of(str.toUpperCase()));
System.out.println(newOptional.get());

使用建议和注意事项

  1. 避免将Optional作为方法参数或返回类型。Optional应该只用于内部变量,而不是作为方法签名的一部分。因为它们并不是普通的Java对象,而是一种特殊的容器对象,这可能会使你的代码更加复杂。
  2. 不要使用Optional来包装已经非空的值。Optional设计的初衷是用于处理可能为空的对象。如果你的变量已经不可能为空,那么就不需要使用Optional来包装它。
  3. 不要使用Optional来代替null检查。Optional的作用是为了在不确定对象是否为空时提供一种安全的替代方案。但是,它并不能完全替代null检查,因为在某些情况下,null检查可能更简单明了。
  4. 谨慎使用orElse()和orElseGet()方法。这些方法用于在Optional对象为空时提供默认值。但是,如果提供的默认值计算代价较高,那么在Optional为空时,这些方法将导致不必要的开销。因此,建议在使用这些方法时,只提供轻量级的默认值。
  5. 使用map()和flatMap()方法来避免多层嵌套的if-else语句。map()和flatMap()方法可以方便地将Optional对象转换为其他对象,从而避免出现多层嵌套的if-else语句。这可以使你的代码更加简洁易读。
转载自:https://juejin.cn/post/7213298252535529530
评论
请登录