枚举的通用过滤器

Aru*_*unM 4 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());
}
Run Code Online (Sandbox Code Playgroud)

}

filter方法的2次迭代实质上过滤掉了无效的枚举类型。如何从中删除重复的代码?该检查应该足够通用,以便isValidEnumenum引入新的检查时不必更改。

理想情况下,我想做类似的事情

 meaninglesses.stream()
            .filter(meaningless -> isValidEnum(meaningless.animal,Animal.class))
            .filter(meaningless -> isValidEnum(meaningless.color,COLOR.class))
Run Code Online (Sandbox Code Playgroud)

Rav*_*ala 6

以下实用程序方法可以解决这个问题,

public static <E extends Enum<E>> boolean validateEnum(Class<E> clazz, String s) {
    return EnumSet.allOf(clazz).stream().anyMatch(e -> e.name().equals(s));
}
Run Code Online (Sandbox Code Playgroud)

这是您的客户代码实际的外观,

boolean isValid = validateEnum(Animal.class, "DOG");
Run Code Online (Sandbox Code Playgroud)

最后,将其放回您的上下文,应该是这样的。

meaninglesses.stream()
    .filter(meaningless -> validateEnum(Animal.class, meaningless.animal))
    .filter(meaningless -> validateEnum(COLOR.class, meaningless.color))
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 使用番石榴,您可以检查`Enums.getIfPresent(clazz,s).isPresent()`。 (3认同)