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 extends T> other) - Return 值(如果存在),否则调用 other 和 return 该调用的结果。
orElseThrow(Supplier extends X> exceptionSupplier) - Return 包含的值,如果存在,否则抛出由提供的供应商创建的异常。
如果我将 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 extends T> other) - Return 值(如果存在),否则调用 other 和 return 该调用的结果。 orElseThrow(Supplier extends X> exceptionSupplier) - Return 包含的值,如果存在,否则抛出由提供的供应商创建的异常。