使用Enum变量切换字符串

时间:2019-06-19 09:58:49

标签: java enums switch-statement

我有一个具有不同值的Enum,并且想要切换一个字符串变量。现在,我碰壁试图将Enum值转换为Strings,可以用作大小写常量。

我最好的尝试是将Enum转换为String数组,但是该开关似乎不接受数组值作为大小写常量。 (IntelliJ说:“需要常量表达式”)

Enum myEnum = {FOO, BAR}

String input = "foo"

final String[] constant = Arrays.stream(myEnum.values()).map(Enum::name).toArray(String[]::new); 
//converts Enum to String[]; made it final, so it is "constant" 

       switch (input) {
                    case constant[0]:
                        System.out.println("foo");
                        break;
                    case constant[1]:
                        System.out.println("bar");
                        break;
                     }

是否有一种优雅的方法可以使此开关依赖于枚举?

4 个答案:

答案 0 :(得分:3)

您可以这样做:

public enum MyEnum {
    FOO("foo"),
    BAR("bar");

    private String value;

    public String getValue() {
        return value;
    }

    public static MyEnum getState(String value) {
        switch (value) {
            case "foo":
                return FOO;
            case "bar":
                return BAR;
        }
        return null;
    }

    private MyEnum(String value) {
        this.value = value;
    }
}

现在,在您的课堂上,您可以:

MyEnum myEnum = getState("foo"); // returns MyEnum.FOO

还要确保您处理getState()返回null时的情况

答案 1 :(得分:3)

您不应该转换它,因为它不是必需的。另外,由于case是Java中的保留关键字,因此您的代码甚至无法编译。

您应该看看valueOf的{​​{1}}方法。

您的代码如下所示:

Enum

这将返回public enum MyEnum {FOO, BAR} //method String input = "foo"; MyEnum niceFound = MyEnum.valueOf(input.toUpperCase()); ,但是当给定值不作为类型出现时可以抛出FOO

答案 2 :(得分:1)

使用MyEnum.valueOf(value.toUpperCase())

public enum MyEnum {
    FOO, BAR;
}

public static void process(String value) {
    try {
        switch (MyEnum.valueOf(value.toUpperCase())) {
            case FOO :
                System.out.println("FOO");
                break;
            case BAR :
                System.out.println("BAR");
                break;
            default :
                break;
        }
    }
    catch (IllegalArgumentException e) {
        // TODO: handle exception
    }

public static void main(String[] a){
    process("foo");
}

答案 3 :(得分:1)

使用Java 8+流的解决方案是在枚举内部创建一个方法:

public static Optional<MyEnum> getByValue(final String value) {
   return Arrays.stream(MyEnum.values())
              .filter(myEnum -> myEnum.value.equals(value))
              .findFirst();
}

在您的String参数没有枚举值的情况下,此返回可选。但是您可以根据需要进行更改。