枚举的通用过滤器

时间:2019-01-22 02:32:53

标签: java lambda java-8 java-stream

以下是我的课程

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))

2 个答案:

答案 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