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