【问题标题】:Java getting the Enum name given the Enum ValueJava 在给定枚举值的情况下获取枚举名称
【发布时间】:2010-10-08 09:23:27
【问题描述】:

在给定值的情况下,如何获取 Java Enum 类型的名称?

我有以下适用于特定枚举类型的代码,我可以让它更通用吗?

public enum Category {

    APPLE("3"), 
    ORANGE("1"), 

    private final String identifier;

    private Category(String identifier) {
        this.identifier = identifier;
    }

    public String toString() {
        return identifier;
    }

    public static String getEnumNameForValue(Object value){
        Category[] values = Category.values();
        String enumValue = null;
        for(Category eachValue : values) {
            enumValue = eachValue.toString();

            if (enumValue.equalsIgnoreCase(value)) {
                return eachValue.name();
            }
        }
        return enumValue;
    }
}

【问题讨论】:

  • 您是否有特殊原因要使用 Enum 的 name() 以外的其他内容来查找它们?这会让很多人感到困惑,而且你也不能使用简单的Category.valueOf(name)
  • 真的可以让它更通用吗?我用了很多nameOf(String name),现在每个我都会写一个*Enum.values().stream().filter(...).findAny().get(),太烦人了。

标签: java enums enumeration


【解决方案1】:

您应该通过调用name() 方法替换您的getEnumNameForValue

【讨论】:

  • @Jukia:另外,考虑覆盖toString()download.oracle.com/javase/6/docs/api/java/lang/…
  • @trashgod:她正在覆盖 toString
  • @Thilo:我的错误;谢谢。 @Julia:抱歉拼错了你的名字。
  • @trashgod:Julia 想要传递值。如何在 name() 函数中将值作为参数传递?
  • @kayeshparvez:我使用了Mapvalues(),正如here 所讨论的那样。
【解决方案2】:

试试下面的代码

public enum SalaryHeadMasterEnum {

    BASIC_PAY("basic pay"),
    MEDICAL_ALLOWANCE("Medical Allowance");

    private String name;

    private SalaryHeadMasterEnum(String stringVal) {
        name=stringVal;
    }
    public String toString(){
        return name;
    }

    public static String getEnumByString(String code){
        for(SalaryHeadMasterEnum e : SalaryHeadMasterEnum.values()){
            if(e.name.equals(code)) return e.name();
        }
        return null;
    }
}

现在您可以使用以下代码按值检索枚举

SalaryHeadMasterEnum.getEnumByString("Basic Pay")

使用下面的代码获取 ENUM 作为字符串

SalaryHeadMasterEnum.BASIC_PAY.name()

使用下面的代码获取枚举的字符串值

SalaryHeadMasterEnum.BASIC_PAY.toString()

【讨论】:

  • code == e.name 不会按您的意思工作,应该改为 e.name.equals(code)
  • 嗯,是的:SalaryHeadMasterEnum.getEnumByString("basic pay") 确实有效,但依赖于 JVM 合并字符串文字。像SalaryHeadMasterEnum.getEnumByString(new StringBuilder("basic ").append("pay").toString()) 这样的东西没有,但恕我直言。使用String.equals() 将使两者都工作;-)
  • - 用 == 比较字符串,这是不好的,以及使用与 'name()' 方法具有不同含义的变量 'name'
【解决方案3】:

试试,下面的代码..

    @Override
    public String toString() {
    return this.name();
    }

【讨论】:

  • 这应该很好用,但是为什么要调用函数toString() 而不是getName()(或类似的东西)?
【解决方案4】:

这是下面的代码,它将从 Enum 值返回 Enum 名称。

public enum Test {

    PLUS("Plus One"), MINUS("MinusTwo"), TIMES("MultiplyByFour"), DIVIDE(
            "DivideByZero");
    private String operationName;

    private Test(final String operationName) {
        setOperationName(operationName);
    }

    public String getOperationName() {
        return operationName;
    }

    public void setOperationName(final String operationName) {
        this.operationName = operationName;
    }

    public static Test getOperationName(final String operationName) {

        for (Test oprname : Test.values()) {
            if (operationName.equals(oprname.toString())) {
                return oprname;
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return operationName;
    }
}

public class Main {
    public static void main(String[] args) {

        Test test = Test.getOperationName("Plus One");
        switch (test) {
        case PLUS:
            System.out.println("Plus.....");
            break;
        case MINUS:
            System.out.println("Minus.....");
            break;

        default:
            System.out.println("Nothing..");
            break;
        }
    }
}

【讨论】:

    【解决方案5】:

    在这种情况下,您可以将 enum 的值转换为 List 并通过它进行流式传输。 像下面的例子。我建议使用 filter()

    使用 ForEach

    List<Category> category = Arrays.asList(Category.values());
    category.stream().forEach(eachCategory -> {
                if(eachCategory.toString().equals("3")){
                    String name = eachCategory.name();
                }
            });
    

    或者,使用过滤器

    当你想用代码查找时:

    List<Category> categoryList = Arrays.asList(Category.values());
    Category category = categoryList.stream().filter(eachCategory -> eachCategory.toString().equals("3")).findAny().orElse(null);
    
    System.out.println(category.toString() + " " + category.name());
    

    当你想用名字查找时:

    List<Category> categoryList = Arrays.asList(Category.values());
    Category category = categoryList.stream().filter(eachCategory -> eachCategory.name().equals("Apple")).findAny().orElse(null);
    
    System.out.println(category.toString() + " " + category.name());
    

    希望对您有所帮助!我知道这是一篇很老的帖子,但有人可以得到帮助。

    【讨论】:

    • 可能会抛出“NullPointerException”; "orElse()" 可以在“当你想用名字查找时:”流的情况下返回 null。
    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多