以下是我的课程
public final class Test {
enum Animal {DOG,CAT};
enum COLOR {RED,YELLOW};
class Meaningless {
String animal,color;
}
public void filter(List<Meaningless> meaninglesses){
meaninglesses.stream()
.filter(meaningless -> {
try {
Animal.valueOf(meaningless.animal);
return true;
}catch(Exception e){
return false;
}
})
.filter(meaningless -> {
try {
COLOR.valueOf(meaningless.color);
return true;
}catch(Exception e){
return false;
}
})
.collect(Collectors.toList());
}
}
filter
方法的2次迭代实质上过滤掉了无效的枚举类型。如何从中删除重复的代码?支票应该足够通用,以便在引入新的isValidEnum
时不必更改enum
。
理想情况下,我想做
meaninglesses.stream()
.filter(meaningless -> isValidEnum(meaningless.animal,Animal.class))
.filter(meaningless -> isValidEnum(meaningless.color,COLOR.class))
答案 0 :(得分:5)
下面的实用程序方法应该可以解决问题,
public static <E extends Enum<E>> boolean validateEnum(Class<E> clazz, String s) {
return EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(s));
}
这是您的客户代码实际的外观,
boolean isValid = validateEnum(Animal.class, "DOG");
最后,将其放回上下文,应该是这样的。
meaninglesses.stream()
.filter(meaningless -> validateEnum(Animal.class, meaningless.animal))
.filter(meaningless -> validateEnum(COLOR.class, meaningless.color))
.collect(Collectors.toList());
答案 1 :(得分:2)
您可以简单地使用Apache Common EnumUtils isValidEnum(Class<E> enumClass,String enumName)
此外,isValidEnumIgnoreCase(Class<E> enumClass,String enumName)
可用于检查是否需要区分大小写。
文档here