Java - 可选枚举

Java - Enumeration as Optional

如果我将 Enum Cities 初始化为 null 但我希望它是 Optional,我的程序就可以运行。我可以将其设置为可选,但是应该将城市作为其参数之一的 class 地址不会这样做,因为城市在 class 地址中未定义为可选,但我不能更改它,使 Optional 成为此 class 的参数并且它有效

这是我的枚举class

public enum Cities {

    NEWYORK("New York",10000),
    LOSANGELES("Los Angeles",90000),
    CHICAGO("Chicago",60000),
    NEWORELANS("NEW Orlans",70000),
    DALLAS("Dallas",75000);

    private final String name;
    private final Integer postalCode;

  Cities(String name, Integer postalCode) {
        this.name=name;
        this.postalCode=postalCode;
    }

它是这样工作的

private static Address addressInput (Scanner scanner) {

        ArrayList<Cities> cityList = new ArrayList<>();
        Cities city = null;

        do {
            for (Cities cities : Cities.values()) {
                System.out.println(cities);
                cityList.add(cities);
            }
            String cityInput = dataInput(scanner, "Type in the name of one of the cities: ");

            for (int j = 0; j < cityList.size(); j++) {
                if (cityInput.equalsIgnoreCase(cityList.get(j).getName())) {
                    city = cityList.get(j);
                }
            }
            if (city == null) {
                System.out.println("Please select one of the cities on the list.");
            }
        } while (city == null);

        String street = dataInput(scanner, "Name of the street: ");
        String houseNumber = dataInput(scanner, "House number: ");

        return new Address.Builder(city)
                .atStreet(street)
                .atHouseNumber(houseNumber)
                .build();
    }

但是 Adress 构造函数现在不会接受可选的城市,因为它在 Adress class

中的定义不同

 private static Address addressInput (Scanner scanner) {

        ArrayList<Cities> cityList = new ArrayList<>();
        Optional<Cities> city = Optional.empty();

        do {
            for (Cities cities : Cities.values()) {
                System.out.println(cities);
                cityList.add(cities);
            }
            String cityInput = dataInput(scanner, "Unesite naziv jednog od ponuđenih gradova: ");

            for (int j = 0; j < cityList.size(); j++) {
                if (cityInput.equalsIgnoreCase(cityList.get(j).getName())) {
                    city = Optional.ofNullable(cityList.get(j));
                }
            }
            if (city.isEmpty()) {
                System.out.println("Molimo odabrati jedan od ponuđenih gradova.");
            }
        } while (city.isEmpty());

public class 地址 {

private String street;
private String houseNumber;
private Cities city;

public Address(Cities city,String street, String houseNumber) {
    this.street = street;
    this.houseNumber = houseNumber;
    this.city=city;
}

public static class Builder {
    Cities city;
    String street;
    String houseNumber;

    public Builder (Cities city){
        this.city=city;
    }

    public Builder atStreet (String street){
        this.street=street;
        return this;
    }

    public Builder atHouseNumber (String houseNumber){
        this.houseNumber=houseNumber;
        return this;
    }

    public Address build (){
        Address address = new Address();
        address.city=city;
        address.houseNumber=houseNumber;
        address.street=street;

        return address;
    }

}

如何编辑class接受可选?

在这里使用 Optional 可能不是上面评论中其他人提到的最好的主意,但如果你真的希望它是为了学习目的,你可以这样做:

    ArrayList<Cities> cityList = new ArrayList<>();
    Optional<Cities> city = Optional.empty();

    do {
        for (Cities cities : Cities.values()) {
            System.out.println(cities);
            cityList.add(cities);
        }
        String cityInput = dataInput(scanner, "Type in the name of one of the cities: ");

        for (int j = 0; j < cityList.size(); j++) {
            if (cityInput.equalsIgnoreCase(cityList.get(j).getName())) {
                city = Optional.ofNullable(cityList.get(j));
            }
        }
        if (!city.isPresent()) {
            System.out.println("Please select one of the cities on the list.");
        }
    } while (!city.isPresent());

    String street = dataInput(scanner, "Name of the street: ");
    String houseNumber = dataInput(scanner, "House number: ");

    return new Address.Builder(city.get())
            .atStreet(street)
            .atHouseNumber(houseNumber)
            .build();

通过使用可选的 get() 方法,您将立即获得它的值,但请注意,如果不存在任何值,它将抛出 NoSuchElementException。通常不建议使用 get() 来获取 Optional 的值,但在这种情况下可以使用它,因为你确定 Optional 会因为 while 条件而出现。

无论如何,当您不确定 optional 是否存在时,最好使用替代的 Optional 方法来获取它的值:

orElse() - Return 值(如果存在),否则 return 其他。 orElseGet(Supplier other) - Return 值(如果存在),否则调用 other 和 return 该调用的结果。 orElseThrow(Supplier exceptionSupplier) - Return 包含的值,如果存在,否则抛出由提供的供应商创建的异常。