在 Java 中,Optional orElse类型 包含 .orElse() .orElseThrow()
orElseThrow() 用法:
无参版本:当 Optional 为空时,抛出 NoSuchElementException;
java
Optional<String> optionalValue = Optional.empty();
String value = optionalValue.orElseThrow(); // 当为空时抛出 NoSuchElementException
带参版本:可以自定义抛出的异常类型
java
Optional<String> optionalValue = Optional.empty();
String value = optionalValue.orElseThrow(() -> new IllegalArgumentException("值不存在"));
用法示例:
java
import java.util.Optional;
import java.util.function.Supplier;
public class OrElseGetExample {
public static void main(String[] args) {
// 1. Optional 有值的情况
Optional<String> presentOpt = Optional.of("存在的值");
String result1 = presentOpt.orElseGet(() -> {
System.out.println("执行了默认值逻辑(本不该执行)"); // 不会执行
return "默认值";
});
System.out.println(result1); // 输出:存在的值
// 2. Optional 为空的情况
Optional<String> emptyOpt = Optional.empty();
String result2 = emptyOpt.orElseGet(() -> {
System.out.println("执行了默认值逻辑"); // 会执行
return "通过Supplier生成的默认值";
});
System.out.println(result2); // 输出:通过Supplier生成的默认值
// 3. 实际场景:复杂默认值的创建(如数据库查询)
Optional<User> userOpt = Optional.empty(); // 假设从数据库查询结果为空
User defaultUser = userOpt.orElseGet(() -> fetchDefaultUserFromDB());
System.out.println("使用的用户:" + defaultUser.getName()); // 输出:默认用户
}
// 模拟从数据库获取默认用户(成本较高的操作)
private static User fetchDefaultUserFromDB() {
System.out.println("执行数据库查询获取默认用户...");
return new User("默认用户");
}
static class User {
private String name;
public User(String name) { this.name = name; }
public String getName() { return name; }
}
}
使用时要注意,如果 Optional 为空,这个方法会立即抛出异常,而不是返回默认值,这是它与 orElse() 和 orElseGet() 的主要区别。
orElseGet() 用法:
java
import java.util.Optional;
import java.util.function.Supplier;
public class OrElseGetExample {
public static void main(String[] args) {
// 1. Optional 有值的情况
Optional<String> presentOpt = Optional.of("存在的值");
String result1 = presentOpt.orElseGet(() -> {
System.out.println("执行了默认值逻辑(本不该执行)"); // 不会执行
return "默认值";
});
System.out.println(result1); // 输出:存在的值
// 2. Optional 为空的情况
Optional<String> emptyOpt = Optional.empty();
String result2 = emptyOpt.orElseGet(() -> {
System.out.println("执行了默认值逻辑"); // 会执行
return "通过Supplier生成的默认值";
});
System.out.println(result2); // 输出:通过Supplier生成的默认值
// 3. 实际场景:复杂默认值的创建(如数据库查询)
Optional<User> userOpt = Optional.empty(); // 假设从数据库查询结果为空
User defaultUser = userOpt.orElseGet(() -> fetchDefaultUserFromDB());
System.out.println("使用的用户:" + defaultUser.getName()); // 输出:默认用户
}
// 模拟从数据库获取默认用户(成本较高的操作)
private static User fetchDefaultUserFromDB() {
System.out.println("执行数据库查询获取默认用户...");
return new User("默认用户");
}
static class User {
private String name;
public User(String name) { this.name = name; }
public String getName() { return name; }
}
}
orElse() 用法:
java
import java.util.Optional;
public class OrElseExample {
public static void main(String[] args) {
// 1. Optional 有值的情况
Optional<String> presentOpt = Optional.of("存在的值");
String result1 = presentOpt.orElse("默认值");
System.out.println(result1); // 输出:存在的值
// 2. Optional 为空的情况
Optional<String> emptyOpt = Optional.empty();
String result2 = emptyOpt.orElse("默认值");
System.out.println(result2); // 输出:默认值
// 3. 注意:默认值的逻辑总会执行(即使 Optional 有值)
Optional<String> opt = Optional.of("有值");
String result3 = opt.orElse(generateDefaultValue());
// 这里会先执行 generateDefaultValue(),再返回 "有值"
}
// 生成默认值的方法
private static String generateDefaultValue() {
System.out.println("执行了生成默认值的逻辑");
return "动态生成的默认值";
}
}
实际开发中需要按具体需求去使用它们