解锁Java8 - Optional 类的奥秘:让你的开发变得更加安全
说明
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对象。
例子
- of():创建一个包含指定值的Optional对象。
Optional<String> optional = Optional.of("Hello, World!");
- ofNullable():创建一个包含指定值的Optional对象,如果值为null,则创建一个空Optional对象。
String str = null;
Optional<String> optional = Optional.ofNullable(str);
- isPresent():检查Optional对象是否包含值。
Optional<String> optional = Optional.of("Hello, World!");
if (optional.isPresent()) {
System.out.println(optional.get());
}
- get():如果Optional对象包含值,则返回该值;否则抛出NoSuchElementException异常。
Optional<String> optional = Optional.of("Hello, World!");
String str = optional.get();
System.out.println(str);
- orElse():如果Optional对象为空,则返回一个默认值。
String str = null;
String defaultStr = "Hello, World!";
String result = Optional.ofNullable(str).orElse(defaultStr);
System.out.println(result);
- orElseGet():如果Optional对象为空,则使用一个Supplier函数生成一个默认值。
String str = null;
Supplier<String> supplier = () -> "Hello, World!";
String result = Optional.ofNullable(str).orElseGet(supplier);
System.out.println(result);
- map():对Optional对象中的值进行操作,并返回一个新的Optional对象。
Optional<String> optional = Optional.of("Hello, World!");
Optional<String> newOptional = optional.map(str -> str.toUpperCase());
System.out.println(newOptional.get());
- 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());
使用建议和注意事项
- 避免将Optional作为方法参数或返回类型。Optional应该只用于内部变量,而不是作为方法签名的一部分。因为它们并不是普通的Java对象,而是一种特殊的容器对象,这可能会使你的代码更加复杂。
- 不要使用Optional来包装已经非空的值。Optional设计的初衷是用于处理可能为空的对象。如果你的变量已经不可能为空,那么就不需要使用Optional来包装它。
- 不要使用Optional来代替null检查。Optional的作用是为了在不确定对象是否为空时提供一种安全的替代方案。但是,它并不能完全替代null检查,因为在某些情况下,null检查可能更简单明了。
- 谨慎使用orElse()和orElseGet()方法。这些方法用于在Optional对象为空时提供默认值。但是,如果提供的默认值计算代价较高,那么在Optional为空时,这些方法将导致不必要的开销。因此,建议在使用这些方法时,只提供轻量级的默认值。
- 使用map()和flatMap()方法来避免多层嵌套的if-else语句。map()和flatMap()方法可以方便地将Optional对象转换为其他对象,从而避免出现多层嵌套的if-else语句。这可以使你的代码更加简洁易读。
转载自:https://juejin.cn/post/7213298252535529530