Java枚举反向查找

Java枚举反向查找,java,enums,Java,Enums,因此,我有一个枚举,它不能像我预期的那样工作,需要进行一些修改: public enum MyEnum { CODE000("text description comes here"), private final String value; private static final Map<String, MyEnum> LOOKUP = Maps.uniqueIndex( Arrays.asList(MyEnum.values

因此,我有一个枚举,它不能像我预期的那样工作,需要进行一些修改:

public enum MyEnum {

    CODE000("text description comes here"),

    private final String value;

    private static final Map<String, MyEnum> LOOKUP = Maps.uniqueIndex(
            Arrays.asList(MyEnum.values()),
            MyEnum::getValue
    );

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

    public String getValue() {
        return value;

    }


    public static MyEnum fromStatus(String status) {
        return LOOKUP.get(status);
    }
}
公共枚举MyEnum{
CODE000(“此处有文字说明”),
私有最终字符串值;
私有静态最终地图查找=Maps.uniqueIndex(
Arrays.asList(MyEnum.values()),
MyEnum::getValue
);
MyEnum(最终字符串值){
这个值=值;
}
公共字符串getValue(){
返回值;
}
公共静态MyEnum fromStatus(字符串状态){
返回LOOKUP.get(状态);
}
}
它现在的工作方式是:

MyEnum.fromStatus(“文本描述在这里”)
当然,我想换一种方式:

MyEnum.fromStatus(“CODE000”)
返回我
“文本描述在此出现”

有人能建议我如何更改它吗?

您的键函数(
MyEnum::getValue
)返回值时出错。 它必须是
MyEnum::name

这将返回枚举,而不是文本描述,因为映射的值的类型为
MyEnum
。您可以通过调用枚举上的
getValue
来获取文本值,也可以将值存储在映射中而不是枚举中

您的键函数(
MyEnum::getValue
)返回值时出错。 它必须是
MyEnum::name


这将返回枚举,而不是文本描述,因为映射的值的类型为
MyEnum
。您可以通过调用枚举上的
getValue
来获取文本值,也可以将值存储在映射中而不是枚举中,您需要的是文本查找,您可以通过调用
valueOf
来获取:

MyEnum code000 =  MyEnum.valueOf("CODE000");
然后:

String val = code000.getValue();

请注意,如果传递给
valueOf
的字符串未解析为
MyEnum

中的枚举文字,则会引发异常。您需要的是文字查找,可以通过调用
valueOf
获得:

MyEnum code000 =  MyEnum.valueOf("CODE000");
然后:

String val = code000.getValue();

请注意,如果传递给
valueOf
的字符串未解析为
MyEnum

中的枚举文字,将引发异常。如果要通过枚举名称获取枚举值,可以使用此函数:

public static String fromStatus(String status) {
    MyEnum myEnum = valueOf(status);

    return myEnum.getValue();
}

如果要通过枚举名称获取枚举值,可以使用以下函数:

public static String fromStatus(String status) {
    MyEnum myEnum = valueOf(status);

    return myEnum.getValue();
}

到目前为止,答案使用的方法是
valueOf
。只要提供枚举常量的名称,此方法将返回枚举常量。否则将抛出一个
IllegalArgumentException

在您的问题中,您使用的是查找地图。映射(看起来像是由Guava创建的
Maps
)将返回非枚举常量名称
null
。在这种情况下,它不会抛出
IllegalArgumentException
。因此,这是一种不同的行为

此外,你会说:“当然,我想要另一种方式”
这意味着您希望按状态获取枚举,并按枚举名称获取状态

因此,您需要有两种查找方法:

  • 状态->枚举
  • 名称->状态
但是,如果您定义了您提到的两种方法,则会出现编译时错误:

  public static MyEnum fromStatus(String status) { ... }

  public static String fromStatus(String name) { ... }
编译器无法按名称和参数区分方法。但是,即使您编写了
MyEnum.fromStatus(“CODE000”)
实际上,它是您用作参数的枚举常量名称。因此,让我们通过调用第二个方法
fromName
来解决命名冲突。MyEnum的代码可能如下所示:

public enum MyEnum {

  CODE000("text description comes here");

  private final String value;

  private static final Map<String, MyEnum> LOOKUP_ENUM = Maps.uniqueIndex(Arrays.asList(MyEnum.values()), MyEnum::getValue);
  private static final Map<String, String> LOOKUP_STATUS = Arrays.stream(MyEnum.values()).collect(Collectors.toMap(MyEnum::name, MyEnum::getValue));

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

  public String getValue() {
    return value;

  }

  public static MyEnum fromStatus(String status) {
    return LOOKUP_ENUM.get(status);
  }

  public static String fromName(String name) {
    return LOOKUP_STATUS.get(name);
  }

}
如果您需要
byName
方法,我建议将
fromName
方法重命名为类似于
statusByName
的名称,以保持它们之间的可理解性

最后还有一个建议:
由于查找方法可能返回
null
,因此我们可以返回
Optional
/
Optional
。这将允许立即继续处理结果

  public static Optional<MyEnum> fromStatus(String status) { ... }
  public static Optional<String> statusByName(String name) { ... }
  public static Optional<MyEnum> byName(String name) { ... }
public静态可选fromStatus(字符串状态){…}
公共静态可选statusByName(字符串名称){…}
公共静态可选byName(字符串名){…}

到目前为止,答案使用的方法是
valueOf
。只要提供枚举常量的名称,此方法将返回枚举常量。否则将抛出一个
IllegalArgumentException

在您的问题中,您使用的是查找地图。映射(看起来像是由Guava创建的
Maps
)将返回非枚举常量名称
null
。在这种情况下,它不会抛出
IllegalArgumentException
。因此,这是一种不同的行为

此外,你会说:“当然,我想要另一种方式”
这意味着您希望按状态获取枚举,并按枚举名称获取状态

因此,您需要有两种查找方法:

  • 状态->枚举
  • 名称->状态
但是,如果您定义了您提到的两种方法,则会出现编译时错误:

  public static MyEnum fromStatus(String status) { ... }

  public static String fromStatus(String name) { ... }
编译器无法按名称和参数区分方法。但是,即使您编写了
MyEnum.fromStatus(“CODE000”)
实际上,它是您用作参数的枚举常量名称。因此,让我们通过调用第二个方法
fromName
来解决命名冲突。MyEnum的代码可能如下所示:

public enum MyEnum {

  CODE000("text description comes here");

  private final String value;

  private static final Map<String, MyEnum> LOOKUP_ENUM = Maps.uniqueIndex(Arrays.asList(MyEnum.values()), MyEnum::getValue);
  private static final Map<String, String> LOOKUP_STATUS = Arrays.stream(MyEnum.values()).collect(Collectors.toMap(MyEnum::name, MyEnum::getValue));

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

  public String getValue() {
    return value;

  }

  public static MyEnum fromStatus(String status) {
    return LOOKUP_ENUM.get(status);
  }

  public static String fromName(String name) {
    return LOOKUP_STATUS.get(name);
  }

}
如果您需要
byName
方法,我建议将
fromName
方法重命名为类似于
statusByName
的名称,以保持它们之间的可理解性

最后还有一个建议:
由于查找方法可能返回
null
,因此我们可以返回
Optional
/
Optional
。这将允许立即继续处理结果

  public static Optional<MyEnum> fromStatus(String status) { ... }
  public static Optional<String> statusByName(String name) { ... }
  public static Optional<MyEnum> byName(String name) { ... }
public静态可选fromStatus(字符串状态){…}
公共静态可选statusByName(字符串名称){…}
公共静态可选byName(字符串名){…}
如果文本de