我需要确定给定的String
是否不在ENUMs
的列表中。
这些Strings
带空格,即:“儿童护理”,“信用卡”等...
除ExpenseType
外,其他任何OTHER
都应映射到HOA
。 HOA
应该被完全忽略。
我的ENUM如下:
public enum ExpenseType {
AUTOLOAN("AUTO LOAN"),
ALIMONY("ALIMONY"),
CHILDCARE("CHILD CARE"),
CREDITCARDS("CREDIT CARDS"),
INSTALLMENTLOANS("INSTALLMENT LOANS"),
FOOD("FOOD"),
UTILITIES("UTILITIES"),
TRANSPORTATION("TRANSPORTATION"),
OTHER("OTHER");
private String expenseType;
ExpenseType(String expenseType) {
this.expenseType = expenseType;
}
@Override public String toString() {
return this.expenseType;
}
}
我现在这样做的方式如下:
String expenseDescription = expense.getExpenseDesc().replaceAll(" ", "");
if(EnumUtils.isValidEnum(ExpenseType.class, expenseDescription)) {
monthlyExpenses.setType(ExpenseType.valueOf(expenseDescription).toString());
}
else if(!expenseDescription.equals("HOA")) {
monthlyExpenses.setType(ExpenseType.OTHER.toString());
}
有人知道更好的方法吗?
答案 0 :(得分:4)
如果适用,为什么不使用getEnum来获取Enum(检查null还是使用Optional 如有需要)
ExpenseType monthlyExpenses = EnumUtils.getEnum(ExpenseType.class, expenseDescription);
获取该类的枚举,如果找不到,则返回null。
此方法与Enum.valueOf(java.lang.Class,java.lang.String)的不同之处在于,它不会为无效的枚举名称引发异常。
还希望在枚举中添加代码(字符串)作为引用,该代码不包含空格和特殊字符,例如
//...
CHILDCARE("CHILD_CARE","CHILD CARE"),
//...
private String expenseType;
private String expenseTypeCode;
ExpenseType(String expenseType, String expenseTypeCode) {
this.expenseType = expenseType;
this.expenseTypeCode = expenseTypeCode;
}
答案 1 :(得分:1)
这是另一种选择。
Map<String, String> codes = Arrays.stream(ExpenseType.values()).collect(
Collectors.toMap(ExpenseType::toString, ExpenseType::name));
codes.put("HOA","TBD");
String[] submittedCodes = { "CREDIT CARDS", "FOOD", "UTILITIES", "UNKNOWN"
};
for (String c : submittedCodes) {
String expenseType = codes.getOrDefault(c,"OTHER");
System.out.println(expenseType);
}
首先,除非您担心增加额外的空格,否则我看不出有理由从提交的代码中删除空格。在这种情况下,您可能还应该删除制表符。
由于您已经在使用枚举值与名称进行比较,我认为我会忽略名称,因为它们实际上是相同的。
我不知道如何处理HOA。但是,所有这些只是您可能要研究的另一种选择,因为您可以重新排列键和值等以适合您的要求。