以下是我的问题 - 我正在寻找(如果存在的话)ArrayList.contains();
方法的枚举等效形式。
这里是我代码问题的示例:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
现在我意识到使用ArrayList
来存储Strings
可能更好,但是我必须在其他地方通过switch/case运行我的枚举内容。因此就产生了问题。
假设这样的解决方案不存在,我该如何处理呢?
以下是我的问题 - 我正在寻找(如果存在的话)ArrayList.contains();
方法的枚举等效形式。
这里是我代码问题的示例:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
现在我意识到使用ArrayList
来存储Strings
可能更好,但是我必须在其他地方通过switch/case运行我的枚举内容。因此就产生了问题。
假设这样的解决方案不存在,我该如何处理呢?
使用Apache commons lang3库替代
EnumUtils.isValidEnum(MyEnum.class, myValue)
ModulacaoFilesEnum(String fileName) {
this.fileName = fileName;
}
} - Mateus Nogueirapublic static boolean contains(String test) {
for (Choice c : Choice.values()) {
if (c.name().equals(test)) {
return true;
}
}
return false;
}
这种方式的意思是,您无需担心以后添加其他枚举值,因为它们都经过了检查。
编辑:如果枚举值非常大,您可以将其放入HashSet中:
public static HashSet<String> getEnums() {
HashSet<String> values = new HashSet<String>();
for (Choice c : Choice.values()) {
values.add(c.name());
}
return values;
}
那么您只需要执行以下操作:values.contains("your string")
,它将返回真或假。
您可以使用 Enum.valueOf()
方法
enum Choices{A1, A2, B1, B2};
public class MainClass {
public static void main(String args[]) {
Choices day;
try {
day = Choices.valueOf("A1");
//yes
} catch (IllegalArgumentException ex) {
//nope
}
}
如果您预计检查失败的频率很高,最好使用其他人展示的简单循环 - 如果您的枚举包含许多值,可以构建一个将枚举值转换为字符串并查询该HashSet
或类似对象的HashSet
。
EnumUtils.isValidEnum(MyEnum.class, myValue)
使用类似的逻辑。在我看来,为这种琐碎的任务添加整个库是有意义的。 - Vikramjit Roypublic enum Period {
DAILY, WEEKLY
};
//This is recommended
Arrays.stream(Period.values()).anyMatch((t) -> t.name().equals("DAILY1"));
//May throw java.lang.IllegalArgumentException
Arrays.stream(Period.values()).anyMatch(Period.valueOf("DAILY")::equals);
比如像这样:
enum MyData {
ONE,
TWO
}
@Test
public void test() {
if (!Enums.getIfPresent(MyData.class, "THREE").isPresent()) {
System.out.println("THREE is not here");
}
}
更好的是:
enum choices {
a1, a2, b1, b2;
public static boolean contains(String s)
{
for(choices choice:values())
if (choice.name().equals(s))
return true;
return false;
}
};
这里提到了几个库,但我错过了我真正要找的一个:Spring!
有一个ObjectUtils#containsConstant库,默认情况下不区分大小写,但如果您想要严格一点,也可以使用。它的用法如下:
if(ObjectUtils.containsConstant(Choices.values(), "SOME_CHOISE", true)){
// do stuff
}
注意:我在这里使用了重载方法来演示如何进行区分大小写的检查。您可以省略布尔值以实现不区分大小写的行为。Java流提供了优雅的方法来实现这一点
Stream.of(MyEnum.values()).anyMatch(v -> v.name().equals(strValue))
返回值:如果流中有任何元素与提供的值匹配,则为true,否则为false
enum Choices{A1, A2, B1, B2};
List choices = Arrays.asList(Choices.values());
//compare with enum value
if(choices.contains(Choices.A1)){
//do something
}
//compare with String value
if(choices.contains(Choices.valueOf("A1"))){
//do something
}
几个假设:
1)没有try/catch,因为它是异常流程控制
2)'contains'方法必须快速,因为它通常运行多次。
3)空间不受限制(对于普通解决方案很常见)
import java.util.HashSet;
import java.util.Set;
enum Choices {
a1, a2, b1, b2;
private static Set<String> _values = new HashSet<>();
// O(n) - runs once
static{
for (Choices choice : Choices.values()) {
_values.add(choice.name());
}
}
// O(1) - runs several times
public static boolean contains(String value){
return _values.contains(value);
}
}