Вот моя проблема - я ищу (если он вообще существует) перечислимый эквивалент ArrayList.contains();
.
Вот пример моей проблемы с кодом:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
Теперь я понимаю, что лучшим ArrayList
из Strings
них будет здесь, но мне нужно пропустить содержимое моего перечисления через переключатель / регистр в другом месте. Отсюда и моя проблема.
Если предположить, что чего-то подобного не существует, как я могу это сделать?
Ответы:
Это должно сделать это:
Этот способ означает, что вам не нужно беспокоиться о добавлении дополнительных значений enum позже, все они проверены.
Изменить: Если перечисление очень большое, вы можете вставить значения в HashSet:
Тогда вы можете просто сделать:
values.contains("your string")
который возвращает истину или ложь.источник
Вместо этого используйте Apache Commons lang3 lib
источник
Ты можешь использовать
Enum.valueOf()
Если вы ожидаете, что проверка будет часто терпеть неудачу, вам может быть лучше использовать простой цикл, как показали другие - если ваши перечисления содержат много значений, возможно, builda
HashSet
или аналогичные значения ваших перечислений, преобразованные в строку, и запроситеHashSet
вместо этого.источник
EnumUtils.isValidEnum(MyEnum.class, myValue)
использует аналогичную логику, и IMO имеет смысл добавить целую библиотеку для этой тривиальной задачиЕсли вы используете Java 1.8, вы можете выбрать Stream + Lambda для реализации этого:
источник
Guavas Enums может быть твоим другом
Например, вот так:
источник
Даже лучше:
источник
Вы можете сначала преобразовать enum в List, а затем использовать метод list, содержащий метод.
источник
Несколько предположений:
1) Не пытайтесь / ловите, так как это исключительное управление потоком
2) Метод «содержит» должен быть быстрым, так как он обычно выполняется несколько раз.
3) Пространство не ограничено (обычно для обычных решений)
источник
Здесь было упомянуто несколько библиотек, но я скучаю по той, которую я действительно искал: Spring!
Существует ObjectUtils # содержитConstant, который по умолчанию не учитывает регистр, но может быть строгим, если хотите. Используется так:
Примечание. Я использовал перегруженный метод, чтобы продемонстрировать, как использовать проверку с учетом регистра. Вы можете опустить логическое значение, чтобы поведение не чувствительно к регистру.
Будьте осторожны с большими перечислениями, поскольку они не используют реализацию Map, как это делают некоторые ...
В качестве бонуса он также предоставляет вариант valueOf: ObjectUtils # caseInsensitiveValueOf без учета регистра
источник
Вы можете использовать это
YourEnum {A1, A2, B1, B2}
Обновление, предложенное @ wightwulf1944, включено, чтобы сделать решение более эффективным.
источник
stream()
набора означает, что вы выполняете итерации по каждому элементу в наборе, а не используете базовую хеш-таблицу, которая будет быстрее. Чтобы улучшить это, лучше всего кэшировать созданный набор и использоватьcontains()
вместо него его метод. Если вам нужно получить поток, используйтеArrays.stream()
вместо этого.Я не думаю, что есть, но вы можете сделать что-то вроде этого:
Редактировать:
Пожалуйста, ознакомьтесь с версией Ричарда, так как она более уместна, так как это не сработает, если вы не конвертируете ее в строки, что делает Ричардс.
источник
.values()
документировано на download.oracle.com/javase/6/docs/api/java/lang/Enum.html ?Java Streams предоставляет элегантный способ сделать это
Возвраты: true, если какие-либо элементы потока соответствуют предоставленному значению, иначе false
источник
Почему бы не объединить ответ Пабло с valueOf ()?
источник
Этот подход можно использовать для проверки любого
Enum
, вы можете добавить его вUtils
класс:Используйте это так:
источник
Я создал следующий класс для этой проверки
пример использования:
источник
Вы можете использовать,
valueOf("a1")
если вы хотите посмотреть на строкуисточник
Это перечисление, это постоянные значения, поэтому, если в выражении switch он просто делает что-то вроде этого:
Также зачем вам знать, что объявлено как константа?
источник
С гуавой это еще проще:
источник
MyEnum.values()
возвращает массив экземпляров MyEnum иMyEnum.value().toString()
возвращает строковое представление этого объекта массива (просто строка как «[LMyEnum; @ 15b94ed3»).name()
вместо.toString()
(если вы не переопределите метод toString по умолчанию). См. Это для получения дополнительной информации: Разница между enum .name () и .toString ()Это объединяет все подходы из предыдущих методов и должно иметь эквивалентную производительность. Он может использоваться для любого перечисления, встраивает решение «Edit» из @Richard H и использует исключения для недопустимых значений, таких как @bestsss. Единственный компромисс в том, что класс должен быть указан, но это превращает его в двухслойный.
}
источник
источник
Решение, чтобы проверить, присутствует ли значение, а также получить значение перечисления в ответ:
источник
Этот работает для меня:
источник
Если вы используете Java 8 или выше, вы можете сделать это:
источник
источник
Вы можете сделать это как метод содержит:
или вы можете просто использовать его со своим блоком кода:
источник
Вы также можете использовать: com.google.common.base.Enums
Enums.getIfPresent (varEnum.class, varToLookFor) возвращает необязательный
Enums.getIfPresent (fooEnum.class, myVariable) .isPresent ()? Enums.getIfPresent (fooEnum.class, myVariable) .get: fooEnum.OTHERS
источник
Я бы просто написал,
Enum # equals работает только с объектами сравнения.
источник
источник
enum
довольно мощный в Java. Вы можете легко добавитьcontains
метод в ваше перечисление (как если бы вы добавили метод в класс):источник
s.equals("b1") || s.equals("b2")
??s.equals("xx")
для каждого перечисления, которое вы добавите позже.