Универсальный фильтр для перечисления - PullRequest
0 голосов
/ 22 января 2019

Мой класс

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

}

2 итерации filter методов по существу отфильтровывают недопустимые типы перечислений.Как я могу удалить дублирование кода из этого?Проверка должна быть достаточно общей, чтобы мне не приходилось менять isValidEnum при появлении нового enum.

В идеале я хотел бы сделать что-то вроде

 meaninglesses.stream()
            .filter(meaningless -> isValidEnum(meaningless.animal,Animal.class))
            .filter(meaningless -> isValidEnum(meaningless.color,COLOR.class))

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Вместо того, чтобы изобретать велосипед, вы можете просто использовать Apache Common EnumUtils isValidEnum(Class<E> enumClass,String enumName)

Кроме того, isValidEnumIgnoreCase(Class<E> enumClass,String enumName) можно использовать для проверки необходимости учета регистра.

Документы здесь

0 голосов
/ 22 января 2019

Следующий полезный метод должен сработать,

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...