Java获取枚举值对应的枚举名称

67

如何根据Java枚举类型的值获取其名称?

下面是我已经有的代码,它适用于 特定的 枚举类型,我能否将它变得更加 通用

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;
    }
}

3
你为什么想使用除Enum的name()之外的东西来查找它们?这会让很多人感到困惑,而且你也无法使用简单的 Category.valueOf(name) - Thilo
真的可以让它更通用吗?我正在使用很多nameOf(String name),现在对于每个我都要写一个*Enum.values().stream().filter(...).findAny().get(),这太烦人了。 - Hearen
7个回答

56

你应该使用调用 name() 方法替换掉你的 getEnumNameForValue


2
@Jukia: 还有,考虑重写 toString() 方法:http://download.oracle.com/javase/6/docs/api/java/lang/Enum.html#toString%28%29 - trashgod
6
她正在覆盖(override)toString方法。 - Thilo
@Thilo:我的错误,谢谢。@Julia:抱歉拼错了你的名字。 - trashgod
1
@trashgod:Julia想要传递这个值。如何将该值作为参数传递给name()函数? - kayesh parvez
1
@kayeshparvez:我使用了一个values()Map,就像这里讨论的那样。 - trashgod

48

尝试使用以下代码

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;
    }
}
现在,您可以使用以下代码通过值来检索Enum。
SalaryHeadMasterEnum.getEnumByString("Basic Pay")

使用以下代码将枚举类型转换为字符串

SalaryHeadMasterEnum.BASIC_PAY.name()

使用以下代码获取枚举类型的字符串值

SalaryHeadMasterEnum.BASIC_PAY.toString()

5
"code == e.name"不会像你想的那样起作用,应改为"e.name.equals(code)"。请注意,翻译后的内容不包括解释或其他任何额外信息。 - f_puras
4
是的,“SalaryHeadMasterEnum.getEnumByString(“basic pay”)”是有效的,但它依赖于JVM合并字符串字面量。类似“SalaryHeadMasterEnum.getEnumByString(new StringBuilder(“basic”)。append(“pay”)。toString())”这样的内容不会生效,但在我看来应该生效。使用“String.equals()”将使两者都可以生效。;-) 注:IMHO表示“In My Humble Opinion”,即“依我拙见”。 - f_puras
2
使用“==”比较字符串是不好的做法,而使用变量“name”表示与“name()”方法不同的含义也是不好的做法。 - Hardcoded

5
请尝试以下代码:
    @Override
    public String toString() {
    return this.name();
    }

这应该很好用,但为什么要调用函数 toString() 而不是 getName()(或类似的名称)? - Mayuso

1

以下是代码,它将从枚举值返回枚举名称。

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;
        }
    }
}

1
enum MyEnum {
    ENUM_A("A"),
    ENUM_B("B");

    private String name;
   
    private static final Map<String,MyEnum> unmodifiableMap;

    MyEnum (String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    static {
        Map<String,MyEnum> map = new ConcurrentHashMap<String, MyEnum>();
        for (MyEnum instance : MyEnum.values()) {
            map.put(instance.getName().toLowerCase(),instance);
        }
        unmodifiableMap = Collections.unmodifiableMap(map);
    }
    public static MyEnum get (String name) {
        return unmodifiableMap.get(name.toLowerCase());
    }
}

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

MyEnum.get("A");


1
在这种情况下,您可以将枚举的值转换为列表并对其进行流处理。 类似以下示例。我建议使用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。 - Piyush Upadhyay

0

我认为最好在枚举本身中提供所需的方法。这是我获取给定值的枚举名称的方式。这适用于CONSTANT(“value”)类型的枚举。

public enum WalletType {
    UPI("upi-paymode"),
    PAYTM("paytm-paymode"),
    GPAY("google-pay");

    private String walletType;
        WalletType(String walletType) {
            this.walletType = walletType;
        }
    
    public String getWalletType() {
        return walletTypeValue;
    }
    
    public WalletType getByValue(String value) {
        return Arrays.stream(WalletType.values()).filter(wallet -> wallet.getWalletType().equalsIgnoreCase(value)).findFirst().get();
    }
}

例如:WalletType.getByValue("google-pay").name() 这将给你 - GPAY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接