Aqui está o meu problema - estou procurando (se é que existe) o equivalente enum de ArrayList.contains();
.
Aqui está uma amostra do meu problema de código:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
Agora, percebo que uma ArrayList
das Strings
rotas seria a melhor aqui, mas preciso executar o conteúdo da minha enum por meio de um switch / case em outro lugar. Daí o meu problema.
Supondo que algo assim não exista, como eu poderia fazê-lo?
Respostas:
Isso deve servir:
Dessa forma, você não precisa se preocupar em adicionar valores adicionais de enum posteriormente, todos eles serão verificados.
Edit: Se a enumeração for muito grande, você poderá colar os valores em um HashSet:
Então você pode simplesmente fazer: o
values.contains("your string")
que retorna verdadeiro ou falso.fonte
Use o apache commons lang3 lib
fonte
Você pode usar
Enum.valueOf()
Se você espera que a verificação falhe com frequência, é melhor usar um loop simples, como outros demonstraram - se suas enumerações contiverem muitos valores, talvez builda
HashSet
ou semelhante aos valores de enumeração convertidos em uma string e, emHashSet
vez disso, consultar isso .fonte
EnumUtils.isValidEnum(MyEnum.class, myValue)
usa uma lógica semelhante e IMO faz sentido para adicionar uma biblioteca inteira para esta tarefa trivialSe você estiver usando o Java 1.8, poderá escolher o Stream + Lambda para implementar isso:
fonte
Melhor ainda:
fonte
Goiabas Enums poderia ser seu amigo
Como por exemplo:
fonte
Você pode primeiro converter a enumeração em Lista e, em seguida, usar o método list contains
fonte
Poucas premissas:
1) Nenhuma tentativa / captura, pois é um controle de fluxo excepcional
2) O método 'contém' deve ser rápido, pois geralmente é executado várias vezes.
3) O espaço não é limitado (comum para soluções comuns)
fonte
Algumas bibliotecas foram mencionadas aqui, mas sinto falta da que realmente estava procurando: Primavera!
Existe o ObjectUtils # containsConstant, que não diferencia maiúsculas de minúsculas por padrão, mas pode ser rígido se você desejar. É usado assim:
Nota: usei o método sobrecarregado aqui para demonstrar como usar a verificação sensível a maiúsculas e minúsculas. Você pode omitir o booleano para ter um comportamento sem distinção entre maiúsculas e minúsculas.
Tenha cuidado com enumerações grandes, pois elas não usam a implementação do Mapa, como algumas fazem ...
Como bônus, ele também fornece uma variante que não diferencia maiúsculas de minúsculas do valueOf: ObjectUtils # caseInsensitiveValueOf
fonte
Você pode usar isso
YourEnum {A1, A2, B1, B2}
A atualização sugerida por @ wightwulf1944 foi incorporada para tornar a solução mais eficiente.
fonte
stream()
um conjunto significa que você está interagindo em cada elemento do conjunto em vez de tirar proveito da hashtable subjacente, que será mais rápida. Para melhorar isso, é melhor armazenar em cache o conjunto criado e usar seucontains()
método. Se você precisar obter um fluxo, use-oArrays.stream()
.Eu não acho que exista, mas você pode fazer algo assim:
Editar:
Por favor, veja a versão de Richard disso, pois é mais apropriado, pois isso não funcionará, a menos que você a converta em Strings, o que Richards faz.
fonte
.values()
documentada em download.oracle.com/javase/6/docs/api/java/lang/Enum.html ?O Java Streams fornece uma maneira elegante de fazer isso
Retorna: true se algum elemento do fluxo corresponder ao valor fornecido, caso contrário, false
fonte
Por que não combinar a resposta de Pablo com um valueOf ()?
fonte
Essa abordagem pode ser usada para verificar qualquer
Enum
, você pode adicioná-lo a umaUtils
classe:Use desta maneira:
fonte
Eu criei a próxima aula para essa validação
exemplo de uso:
fonte
Você pode usar
valueOf("a1")
se quiser procurar por Stringfonte
É um enum, esses são valores constantes; portanto, se estiver em uma instrução switch, está apenas fazendo algo assim:
Além disso, por que você precisaria saber o que é declarado como constante?
fonte
Com goiaba é ainda mais simples:
fonte
MyEnum.values()
retornos matriz de MyEnum instâncias eMyEnum.value().toString()
representação retornos cadeia de este objecto matriz (apenas cadeia como "[LMyEnum; @ 15b94ed3").name()
vez de.toString()
(a menos que substitua o método toString padrão). Veja isto para obter mais informações: Diferença entre enum .name () e .toString ()Isso combina todas as abordagens dos métodos anteriores e deve ter desempenho equivalente. Ele pode ser usado para qualquer enumeração, destaca a solução "Editar" do @Richard H e usa Exceções para valores inválidos como @bestsss. A única desvantagem é que a classe precisa ser especificada, mas isso transforma isso em uma linha dupla.
}
fonte
fonte
solução para verificar se o valor está presente e obter o valor enum em troca:
fonte
Este funciona para mim:
fonte
Se você estiver usando o Java 8 ou superior, poderá fazer o seguinte:
fonte
fonte
Você pode fazer isso como um método contains:
ou você pode simplesmente usá-lo com seu bloco de código:
fonte
você também pode usar: com.google.common.base.Enums
Enums.getIfPresent (varEnum.class, varToLookFor) retorna um opcional
Enums.getIfPresent (fooEnum.class, myVariable) .isPresent ()? Enums.getIfPresent (fooEnum.class, myVariable) .get: fooEnum.OTHERS
fonte
Eu apenas escreveria
Enum # equals só funciona com comparação de objetos.
fonte
fonte
enum
são bastante poderosos em Java. Você pode facilmente adicionar umcontains
método à sua enumeração (como você adicionaria um método a uma classe):fonte
s.equals("b1") || s.equals("b2")
??s.equals("xx")
para cada enum que adicionar posteriormente.