1. 首页
  2. Java

Optional操作,Java中的?.操作符

在 Java 中,您可以使用 Optional 来模拟 JavaScript 中的可选链操作符 ?.,以安全地访问嵌套属性。假设我们有一个 User 类,其中包含一个 City 对象,而 City 对象有一个 cityName 属性。

下面是一个完整的示例,展示如何使用 Optional 来实现与 JavaScript 的 user?.city?.cityName 类似的功能。

类定义

首先,我们定义 UserCity 类:

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 来安全地访问 UsercitycityName 属性:

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):创建一个可能包含 userWithCityOptional 对象。如果 userWithCitynull,则 Optional 将为空。

  • map(User::getCity):尝试从 User 对象中获取 City 对象。如果 Usernull,则这个 map 调用将不会被执行,结果将是一个空的 Optional

  • map(City::getCityName):尝试从 City 对象中获取 cityName

  • orElse("Unknown City"):如果在任何一层中某个对象为 null,则返回默认值 "Unknown City"

通过这种方式,您可以安全地处理多层嵌套属性,避免 NullPointerException,这与 JavaScript 中的可选链操作符 ?. 的行为类似。


TOP