在 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 中的可选链操作符 ?.
的行为类似。