Optional中的orElse()和orElseGet()有什么区别
时间: 2024-04-20 11:27:41 浏览: 116
`orElse()` 和 `orElseGet()` 都是用于处理 `Optional` 对象为空的情况,提供一个备用值作为替代。它们之间的区别在于备用值的生成方式。
`orElse()` 方法在 `Optional` 对象为空时,会直接返回指定的备用值。无论 `Optional` 是否为空,备用值都会被计算。这意味着即使 `Optional` 中已经包含了一个非空的值,备用值也会被计算。
`orElseGet()` 方法在 `Optional` 对象为空时,会调用一个提供者函数来生成备用值。只有当 `Optional` 为空时,提供者函数才会被调用。如果 `Optional` 不为空,提供者函数不会执行。
以下是 `orElse()` 和 `orElseGet()` 方法的示例代码:
```java
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optional1 = Optional.empty();
String value1 = optional1.orElse(getDefaultValue());
System.out.println(value1); // 输出:Default Value
Optional<String> optional2 = Optional.of("Hello");
String value2 = optional2.orElse(getDefaultValue());
System.out.println(value2); // 输出:Hello
Optional<String> optional3 = Optional.empty();
String value3 = optional3.orElseGet(() -> getDefaultValue());
System.out.println(value3); // 输出:Default Value
Optional<String> optional4 = Optional.of("Hello");
String value4 = optional4.orElseGet(() -> getDefaultValue());
System.out.println(value4); // 输出:Hello
}
public static String getDefaultValue() {
System.out.println("Generating default value...");
return "Default Value";
}
}
```
在上述代码中,我们创建了两个 `Optional` 对象 `optional1` 和 `optional2`,分别为空和包含字符串 "Hello"。然后,我们使用 `orElse()` 和 `orElseGet()` 方法获取备用值。
对于 `optional1`,`orElse()` 和 `orElseGet()` 都会返回备用值 "Default Value",因为 `optional1` 为空。对于 `optional2`,`orElse()` 方法不会调用提供者函数,而直接返回 `optional2` 中的值 "Hello"。而 `orElseGet()` 方法也不会调用提供者函数,因为 `optional2` 不为空。
输出:
```
Generating default value...
Default Value
Hello
Generating default value...
Default Value
Hello
```
从输出结果可以看出,`orElse()` 方法和 `orElseGet()` 方法都可以用来获取备用值,但是在备用值的生成方式上略有不同。如果备用值的计算代价较高,或者备用值是根据需要动态生成的,建议使用 `orElseGet()` 方法以避免不必要的计算。
阅读全文