Answers:
应该这样做:
public 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")
返回true或false。
改用Apache commons lang3 lib
EnumUtils.isValidEnum(MyEnum.class, myValue)
您可以使用 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
}
}
如果您希望检查经常失败,那么最好使用其他循环所示的简单循环-如果您的枚举包含许多值,则可能将builda HashSet
或类似的枚举值转换为字符串并进行查询HashSet
。
EnumUtils.isValidEnum(MyEnum.class, myValue)
使用类似的逻辑和IMO,为这个琐碎的任务添加一个完整的库确实很有意义
如果您使用的是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);
更好的是:
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;
}
};
您可以先将枚举转换为List,然后使用list contains方法
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
}
这里提到了几个库,但是我想念我真正想要的一个库:春天!
有一个ObjectUtils#containsConstant,默认情况下不区分大小写,但如果需要,可以严格。它的用法如下:
if(ObjectUtils.containsConstant(Choices.values(), "SOME_CHOISE", true)){
// do stuff
}
注意:我在这里使用了重载方法来演示如何使用区分大小写的检查。您可以忽略布尔值以使其具有不区分大小写的行为。
但是请注意大型枚举,因为它们不会像某些枚举那样使用Map实现...
另外,它还提供了valueOf的不区分大小写的变体:ObjectUtils#caseInsensitiveValueOf
很少有以下假设:
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);
}
}
你可以用这个
YourEnum {A1,A2,B1,B2}
boolean contains(String str){
return Sets.newHashSet(YourEnum.values()).contains(str);
}
@ wightwulf1944建议的更新已合并,以使解决方案更有效。
stream()
在set上使用意味着您要对set中的每个元素进行迭代,而不是利用将更快的基础哈希表。为了改善这一点,最好缓存创建的Set并改用它的contains()
方法。如果必须获取流,请Arrays.stream()
改用。
我认为没有,但是您可以执行以下操作:
enum choices {a1, a2, b1, b2};
public static boolean exists(choices choice) {
for(choice aChoice : choices.values()) {
if(aChoice == choice) {
return true;
}
}
return false;
}
编辑:
请查看Richard的版本,因为它更合适,因为除非将其转换为使用Richards的Strings,否则它将不起作用。
为什么不将Pablo的回复与valueOf()结合起来?
public enum Choices
{
a1, a2, b1, b2;
public static boolean contains(String s) {
try {
Choices.valueOf(s);
return true;
} catch (Exception e) {
return false;
}
}
此方法可用于检查任何Enum
,您可以将其添加到Utils
类中:
public static <T extends Enum<T>> boolean enumContains(Class<T> enumerator, String value)
{
for (T c : enumerator.getEnumConstants()) {
if (c.name().equals(value)) {
return true;
}
}
return false;
}
使用这种方式:
boolean isContained = Utils.enumContains(choices.class, "value");
我为此验证创建了下一个类
public class EnumUtils {
public static boolean isPresent(Enum enumArray[], String name) {
for (Enum element: enumArray ) {
if(element.toString().equals(name))
return true;
}
return false;
}
}
使用示例:
public ArrivalEnum findArrivalEnum(String name) {
if (!EnumUtils.isPresent(ArrivalEnum.values(), name))
throw new EnumConstantNotPresentException(ArrivalEnum.class,"Arrival value must be 'FROM_AIRPORT' or 'TO_AIRPORT' ");
return ArrivalEnum.valueOf(name);
}
valueOf("a1")
如果要按字符串查找,可以使用
它是一个枚举,它们是常量值,因此,如果在switch语句中执行以下操作:
case: val1
case: val2
另外,为什么还要知道什么是常量?
使用番石榴,它甚至更简单:
boolean isPartOfMyEnum(String myString){
return Lists.newArrayList(MyEnum.values().toString()).contains(myString);
}
MyEnum.values()
返回MyEnum实例的数组并MyEnum.value().toString()
返回此数组对象的字符串表示形式(只是字符串,例如“ [LMyEnum; @ 15b94ed3”)
这结合了以前方法的所有方法,并且应具有同等的性能。它可以用于任何枚举,内联@Richard H的“编辑”解决方案,并对@bestsss等无效值使用Exceptions。唯一的权衡是需要指定类,但这使它变成了两层。
import java.util.EnumSet;
public class HelloWorld {
static enum Choices {a1, a2, b1, b2}
public static <E extends Enum<E>> boolean contains(Class<E> _enumClass, String value) {
try {
return EnumSet.allOf(_enumClass).contains(Enum.valueOf(_enumClass, value));
} catch (Exception e) {
return false;
}
}
public static void main(String[] args) {
for (String value : new String[] {"a1", "a3", null}) {
System.out.println(contains(Choices.class, value));
}
}
}
检查值是否存在的解决方案以及获取枚举值作为回报:
protected TradeType getEnumType(String tradeType) {
if (tradeType != null) {
if (EnumUtils.isValidEnum(TradeType.class, tradeType)) {
return TradeType.valueOf(tradeType);
}
}
return null;
}
这对我有用:
Arrays.asList(YourEnum.values()).toString().contains("valueToCheck");
您可以将其作为包含方法:
enum choices {a1, a2, b1, b2};
public boolean contains(String value){
try{
EnumSet.allOf(choices.class).contains(Enum.valueOf(choices.class, value));
return true;
}catch (Exception e) {
return false;
}
}
或者您可以将其与代码块一起使用:
try{
EnumSet.allOf(choices.class).contains(Enum.valueOf(choices.class, "a1"));
//do something
}catch (Exception e) {
//do something else
}
enum
在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;
}
};
s.equals("b1") || s.equals("b2")
吗?
s.equals("xx")
为每个枚举添加新的枚举。