使用Optional类优化代码中多层if嵌套

Optional 类可以帮助我们简化多层 if 嵌套,特别是在处理可能为 null 的值时。以下是一个通过 Optional 来简化多层 if 嵌套的示例。

问题场景

假设我们有一个获取用户地址信息的场景,用户、地址、城市等信息都可能为空,我们需要检查这些信息是否存在,并最终获取用户所在城市的名称。如果没有城市信息,就返回默认值。

传统的多层 if 嵌套代码可能如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
public String getCityName(User user) {
if (user != null) {
Address address = user.getAddress();
if (address != null) {
City city = address.getCity();
if (city != null) {
return city.getName();
}
}
}
return "Unknown City";
}

使用 Optional 简化代码

使用 Optional 可以避免这些嵌套 if,让代码更加简洁易读。

1
2
3
4
5
6
7
public String getCityName(User user) {
return Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.map(City::getName)
.orElse("Unknown City");
}

解析

  1. Optional.ofNullable(user):创建一个可能为空的 Optional<User>,如果 usernull,则返回一个空的 Optional

  2. map(User::getAddress):如果 user 不为空,则调用 getAddress() 获取地址信息,并返回 Optional<Address>。如果 user 为空,直接返回空的 Optional,避免进入下一步。

  3. map(Address::getCity):同理,如果地址信息不为空,则获取城市信息,并返回 Optional<City>

  4. map(City::getName):获取城市的名称,返回 Optional<String>

  5. orElse("Unknown City"):如果最终的 Optional<String> 中有值,则返回该值;如果没有值(即之前的任意一步为 null),则返回 "Unknown City" 作为默认值。

通过 Optional,我们有效避免了多个嵌套的 if 语句,使代码更加清晰和安全。