在 Java 中,您可以使用 Optional 来模拟 JavaScript 中的可选链操作符 ?.,以安全地访问嵌套属性。假设我们有一个 User 类,其中包含一个 City 对象,而 City 对象有一个 cityName 属性。
下面是一个完整的示例,展示如何使用 Optional 来实现与 JavaScript 的 user?.city?.cityName 类似的功能。
类定义
首先,我们定义 User 和 City 类:
class City {
private String cityName;
public City(String cityName) {
this.cityName = cityName;
}
public String getCityName() {
return cityName;
}
}
class User {
private City city;
public User(City city) {
this.city = city;
}
public City getCity() {
return city;
}
}使用 Optional 来安全访问 cityName
现在,我们可以使用 Optional 来安全地访问 User 的 city 和 cityName 属性:
import java.util.Optional;
public class Main {
public static void main(String[] args) {
User userWithCity = new User(new City("New York"));
User userWithoutCity = new User(null);
User nullUser = null;
// 使用 Optional 来安全访问 cityName
String cityName1 = Optional.ofNullable(userWithCity)
.map(User::getCity) // 获取 City
.map(City::getCityName) // 获取 cityName
.orElse("Unknown City"); // 如果为 null,返回 "Unknown City"
String cityName2 = Optional.ofNullable(userWithoutCity)
.map(User::getCity) // 获取 City
.map(City::getCityName) // 获取 cityName
.orElse("Unknown City"); // 如果为 null,返回 "Unknown City"
String cityName3 = Optional.ofNullable(nullUser)
.map(User::getCity) // 获取 City
.map(City::getCityName) // 获取 cityName
.orElse("Unknown City"); // 如果为 null,返回 "Unknown City"
System.out.println(cityName1); // 输出: New York
System.out.println(cityName2); // 输出: Unknown City
System.out.println(cityName3); // 输出: Unknown City
}
}解释
Optional.ofNullable(userWithCity):创建一个可能包含userWithCity的Optional对象。如果userWithCity为null,则Optional将为空。map(User::getCity):尝试从User对象中获取City对象。如果User为null,则这个map调用将不会被执行,结果将是一个空的Optional。map(City::getCityName):尝试从City对象中获取cityName。orElse("Unknown City"):如果在任何一层中某个对象为null,则返回默认值"Unknown City"。
通过这种方式,您可以安全地处理多层嵌套属性,避免 NullPointerException,这与 JavaScript 中的可选链操作符 ?. 的行为类似。