在Java中将随机字符串转换为Enum

时间:2018-10-04 12:50:07

标签: java enums

我已经定义了这个枚举,客户端可以在其中传递一些随机类型,我想将它们转换为一致的可用形式:

package com.amazon.dvpatemplateselectionservice.types;

public enum Cases {
    LOWERCASE("lowercase"), UPPERCASE("UPPERCASE"), CAMEL("camelCased");

    private final String someCase;

    Cases(final String inputCase) {
        this.someCase = inputCase;
    }
}

当我在代码中调用此代码时,我希望来自客户端的输入转换为枚举:

Cases whatever = Cases.valueOf(Cases.class, requestParams.getValue());

Class someClass = new Class(whatever);

我得到的错误:

java.lang.IllegalArgumentException: camelCased is not a constant in Cases

我在这里想念什么?

4 个答案:

答案 0 :(得分:1)

name的{​​{1}}参数要求枚举名称完全与声明的名称相同,并且不能与您的输入一起使用。

您将需要使用以下自定义查找方法,例如Enum#valueOf

find

并像这样使用它:

enum Cases {
    LOWERCASE("lowercase"), UPPERCASE("UPPERCASE"), CAMEL("camelCased");

    private final String caze;

    Cases(final String inputCase) {
        this.caze = inputCase;
    }

    public static Cases find(String c) {
        //you can also just loop
        return Stream.of(values()).filter(v -> v.caze.equals(c))
                 .findFirst().orElse(null);
    }
}

答案 1 :(得分:1)

Cases whatever = Cases.find(requestParams.getValue()); 正在寻找枚举项的常量名称。例如,Cases.valueOf(String)LOWERCASEUPPERCASE

如果要从字段中查找枚举项,请编写一种方法来实现。

CAMEL

答案 2 :(得分:0)

public static Cases fromString(String string) { return Arrays.stream(Cases.values()) .filter(x -> x.someCase.equals(string)) .findAny() .orElseThrow(() -> new IllegalArgumentException("No such case: "+string)); } 尝试使用给定的Enum.valueOf(Class<T> enumType, String name)see Enum.valueOf javadoc)创建类型为enumType的枚举。

因此,您必须构造一个自定义查找方法,该方法将在您称为name的字段上使用以构造Cases类型的枚举。

答案 3 :(得分:0)

在您的case中添加此方法(我将enum重命名为case,因为_case是禁止的Java关键字):

case

然后:

public static Cases fromLabel(String label)
{
    return Stream.of(Cases.values())
    .filter(c -> c._case.equals(label))
    .findFirst().orElse(null);
}