Мне нужно проверить файл CSV с кучей столбцов. Некоторым из них необходимо сопоставить различные типы перечислений. Я знаю, как проверить строковое значение на соответствие определенному типу перечисления, но мне хотелось бы иметь общий метод проверки, в котором я мог бы передавать строковое значение и тип перечисления и получать результат проверки. Пока у меня есть это:
private boolean valitateSomeSpecificEnum(String value) {
try {
SomeSpecificEnum.valueOf(value);
return true;
} catch (IllegalArgumentException e) {
return false;
}
}
Возможно ли что-то вроде:
private boolean valitateAgainstTheEnum(String value, Enum<?> theEnum) {
try {
theEnum.valueOf(value);
return true;
} catch (IllegalArgumentException e) {
return false;
}
}
Обратите внимание: я использую Enum<?>
в сигнатуре метода просто для того, чтобы было понятно, чего я хочу достичь. Я знаю, что в написанном виде это не сработает.
Тогда я мог бы назвать это так
valitateTheEnum("foo", SomeSpecificEnum.class);
это вообще возможно?
Это какой-то конкретный класс перечисления, который у меня уже есть.
Смотрите это
Вопросы @Ajant в Stack Overflow должны быть конкретными и включать минимальный воспроизводимый пример, поэтому вам следует включить такие классы в свой вопрос.
Ух ты, два голоса против и закрытый вопрос, потому что мне не удалось найти похожий и определенно не дублированный вопрос??? Тем, кто помог, большое спасибо за ваш вклад. Тем, кто проголосовал против и закрыл, что угодно.
Однако немного загадочно, почему вам нужно проверять, поскольку обычным результатом является простое сопоставление компонентов.
Я обрабатываю файл csv вручную. Когда я читаю файл, я получаю кучу массивов строк. Мне нужно выполнить различные проверки (формат почты, непустота и т. д.) для различных столбцов и создать очень специфический формат ответа. Мне не известен какой-либо способ автоматического сопоставления таких данных, но я был бы рад изучить любые ваши предложения.
Основываясь на ссылке, предоставленной g00se в комментарии, я придумал это, и это работает:
private boolean valitateAgainstTheEnum(String value, Class<? extends Enum> theEnum) {
try {
Enum.valueOf(theEnum, value);
return true;
} catch (IllegalArgumentException e) {
return false;
}
}
Остается только вопрос, есть ли более элегантный способ сделать это.
Вы пробовали использовать потоки?
Не уверен, что понимаю вопрос
Вы можете попробовать Stream.anyMatch().
Нравиться:
private static <E extends Enum<E>> boolean validate(String value, Class<E> enumClass) {
return Stream.of(enumClass.getEnumConstants()).anyMatch(e -> e.name().equals(value));
}
ПРИМЕЧАНИЕ. Я изменил общую подпись, чтобы предотвратить предупреждение «необработанного типа».
Зачем вам транслировать что-то, если вы можете получить к нему прямой доступ без циклических конструкций?
Этот вопрос отмечен как дублированный. Вы можете отправить свой ответ на исходный вопрос.
@ g00se Потому что OP нужен логический результат вместо члена перечисления, и Enum.valueOf
не возвращает null
, а выдает IllegalArgumentException
, если значение не найдено.
Извините, я этого даже отдаленно не понимаю.
Что находится в SomeSpecificEnum?