Jar*_*red 142 java string enums
这是我的问题 - 我正在寻找(如果它甚至存在)枚举相当于ArrayList.contains();.
这是我的代码问题的示例:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
Run Code Online (Sandbox Code Playgroud)
现在,我意识到一个ArrayList的Strings会在这里更好的路线,但我通过一个开关/箱其他地方运行我的枚举的内容.因此我的问题.
假设不存在这样的事情,我怎么能去做呢?
小智 206
请改用Apache commons lang3 lib
EnumUtils.isValidEnum(MyEnum.class, myValue)
Run Code Online (Sandbox Code Playgroud)
Ric*_*d H 185
这应该这样做:
public static boolean contains(String test) {
for (Choice c : Choice.values()) {
if (c.name().equals(test)) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这意味着您不必担心以后添加额外的枚举值,它们都会被检查.
编辑:如果枚举非常大,您可以将值粘贴在HashSet中:
public static HashSet<String> getEnums() {
HashSet<String> values = new HashSet<String>();
for (Choice c : Choice.values()) {
values.add(c.name());
}
return values;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以做:values.contains("your string")返回true或false.
nos*_*nos 47
您可以使用 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
}
}
Run Code Online (Sandbox Code Playgroud)
如果您希望检查经常失败,您可能最好使用其他已显示的简单循环 - 如果您的枚举包含许多值,可能是builda HashSet或类似的枚举值转换为字符串HashSet而是查询.
Hao*_* Ma 27
如果您使用的是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);
Run Code Online (Sandbox Code Playgroud)
H6.*_*H6. 18
像这样:
enum MyData {
ONE,
TWO
}
@Test
public void test() {
if (!Enums.getIfPresent(MyData.class, "THREE").isPresent()) {
System.out.println("THREE is not here");
}
}
Run Code Online (Sandbox Code Playgroud)
小智 16
更好的是:
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;
}
};
Run Code Online (Sandbox Code Playgroud)
您可以先将枚举转换为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
}
Run Code Online (Sandbox Code Playgroud)
这里提到了几个图书馆,但我想念我真正想要的那个:春天!
还有就是ObjectUtils#containsConstant这是不区分大小写的默认,但如果你希望能严格.它是这样使用的:
if(ObjectUtils.containsConstant(Choices.values(), "SOME_CHOISE", true)){
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
注意:我在这里使用了重载方法来演示如何使用区分大小写的检查.您可以省略布尔值以使用不区分大小写的行为.
但要注意大型枚举,因为他们不像某些人那样使用Map实现...
作为奖励,它还提供了valueOf的一个不区分大小写的变体:ObjectUtils #caseInsensitiveValueOf
你可以用它
YourEnum {A1,A2,B1,B2}
boolean contains(String str){
return Sets.newHashSet(YourEnum.values()).contains(str);
}
Run Code Online (Sandbox Code Playgroud)
@ wightwulf1944建议更新,以提高解决方案的效率.
几个假设:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Java Streams 提供了一种优雅的方式来做到这一点
Stream.of(MyEnum.values()).anyMatch(v -> v.name().equals(strValue))
Run Code Online (Sandbox Code Playgroud)
返回: 如果流的任何元素与提供的值匹配,则为 true,否则为 false