确定String是否不在ENUM列表中的最佳方法

时间:2019-05-06 13:13:49

标签: java enums

我需要确定给定的String是否不在ENUMs的列表中。

这些Strings带空格,即:“儿童护理”,“信用卡”等...

ExpenseType外,其他任何OTHER都应映射到HOAHOA应该被完全忽略。

我的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());
}

有人知道更好的方法吗?

2 个答案:

答案 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);
      }

首先,除非您担心增加额外的空格,否则我看不出有理由从提交的代码中删除空格。在这种情况下,您可能还应该删除制表符。

由于您已经在使用枚举值与名称进行比较,我认为我会忽略名称,因为它们实际上是相同的。

  • 该映射仅用于在键丢失的情况下返回null。
  • 枚举仅用于方便地填充地图。

我不知道如何处理HOA。但是,所有这些只是您可能要研究的另一种选择,因为您可以重新排列键和值等以适合您的要求。