如何用Optional优化代码结构
使用Optional类可以有效地优化代码结构,避免空指针异常(NullPointerException),提高代码的可读性和健壮性。以下是一些使用Optional优化代码结构的建议:
1. 避免显式的空检查
传统的空检查通常使用if语句,这会导致代码冗余且难以维护。使用Optional可以简化这些检查。
传统方式:
public String getName(User user) {
if (user != null) {
Address address = user.getAddress();
if (address != null) {
return address.getCity();
}
}
return "Unknown";
}
使用Optional优化:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("Unknown");
}
2. 使用orElse提供默认值
当需要一个默认值时,可以使用orElse方法。
示例:
public String getCityOrDefault(User user) {
return Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("Unknown City");
}
3. 使用orElseGet延迟计算默认值
当默认值的计算成本较高时,可以使用orElseGet方法,它只在需要时才计算默认值。
示例:
public String getCityOrDefault(User user) {
return Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElseGet(() -> {
// 昂贵的计算
return computeDefaultCity();
});
}
4. 使用orElseThrow抛出自定义异常
当需要抛出自定义异常时,可以使用orElseThrow方法。
示例:
public String getCityOrThrow(User user) {
return Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElseThrow(() -> new UserNotFoundException("User not found"));
}
5. 链式调用
Optional支持链式调用,可以使代码更加简洁和易读。
示例:
public void printCity(User user) {
Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.ifPresent(System.out::println);
}
6. 处理集合中的Optional
当处理集合中的元素时,可以使用stream和Optional的组合。
示例:
public List getCities(List users) {
return users.stream()
.map(User::getAddress)
.map(Address::getCity)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
}
7. 避免过度使用Optional
虽然Optional有很多优点,但过度使用也会导致代码变得复杂和难以理解。只在必要时使用Optional,例如返回值可能是空的情况。
通过以上方法,可以有效地使用Optional优化代码结构,提高代码的可读性和健壮性。