这是我的问题-我正在寻找(如果它甚至存在)等价于ArrayList.contains();的enum。

下面是我的代码问题示例:

enum choices {a1, a2, b1, b2};

if(choices.???(a1)}{
//do this
} 

现在,我意识到字符串的数组列表在这里是更好的路由,但我必须通过其他地方的开关/case运行我的enum内容。这就是我的问题所在。

假设这样的东西不存在,我该怎么做呢?


当前回答

你可以用这个

YourEnum {A1, A2, B1, B2}

boolean contains(String str){ 
    return Sets.newHashSet(YourEnum.values()).contains(str);
}                                  

@wightwulf1944建议的更新被纳入,使解决方案更有效。

其他回答

你也可以使用:com.google.common.base.Enums

enumes . getifpresent (varEnum.class, varToLookFor)返回一个Optional

enumes . getifpresent (fooenumer .class, myVariable).isPresent() ? Enums.getIfPresent (fooEnum.class myVariable)。get: fooEnum。其他人

一些假设: 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);
    }
}

Java Streams提供了一种优雅的方式来做到这一点

Stream.of(MyEnum.values()).anyMatch(v -> v.name().equals(strValue))

返回: 如果流中的任何元素与提供的值匹配,则为True,否则为false

更好的是:

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;
  } 

};

EnumUtils。如果你想导入Apache commons lang3, isValidEnum可能是最好的选择。如果不是下面是一个通用函数,我会用作替代。

private <T extends Enum<T>> boolean enumValueExists(Class<T> enumType, String value) {
    boolean result;
    try {
        Enum.valueOf(enumType, value);
        result = true;
    } catch (IllegalArgumentException e) {
        result = false;
    }
    return result;
}

然后像下面这样使用

if (enumValueExists(MyEnum.class, configValue)) {
    // happy code
} else {
    // angry code
}