这是我的问题-我正在寻找(如果它甚至存在)等价于ArrayList.contains();的enum。
下面是我的代码问题示例:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
现在,我意识到字符串的数组列表在这里是更好的路由,但我必须通过其他地方的开关/case运行我的enum内容。这就是我的问题所在。
假设这样的东西不存在,我该怎么做呢?
这是我的问题-我正在寻找(如果它甚至存在)等价于ArrayList.contains();的enum。
下面是我的代码问题示例:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
现在,我意识到字符串的数组列表在这里是更好的路由,但我必须通过其他地方的开关/case运行我的enum内容。这就是我的问题所在。
假设这样的东西不存在,我该怎么做呢?
当前回答
这里已经提到了几个库,但是我错过了我真正要找的一个:Spring!
ObjectUtils#containsConstant默认情况下是不区分大小写的,但如果你愿意,可以严格设置。它是这样使用的:
if(ObjectUtils.containsConstant(Choices.values(), "SOME_CHOISE", true)){
// do stuff
}
注意:我在这里使用重载方法是为了演示如何使用区分大小写的检查。您可以省略布尔值以具有不区分大小写的行为。
但是要小心使用大的枚举,因为他们不像一些人那样使用Map实现…
作为奖励,它还提供了valueOf的大小写不敏感变体:ObjectUtils#caseInsensitiveValueOf
其他回答
枚举在Java中非常强大。你可以很容易地在枚举中添加contains方法(就像在类中添加方法一样):
enum choices {
a1, a2, b1, b2;
public boolean contains(String s)
{
if (s.equals("a1") || s.equals("a2") || s.equals("b1") || s.equals("b2"))
return true;
return false;
}
};
public boolean contains(Choices value) {
return EnumSet.allOf(Choices.class).contains(value);
}
如果你使用的是Java 1.8,你可以选择Stream + Lambda来实现:
public 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);
一些假设: 1)没有尝试/捕捉,因为它是特殊的流量控制 2)“包含”方法必须是快速的,因为它通常运行几次。 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);
}
}
它是一个枚举,这些都是常量值,所以如果它在switch语句中,它就像这样做:
case: val1
case: val2
还有,为什么你需要知道什么被声明为常数?