Suganthan Madhavan Pillai
¿Hay algún método de Java 8 o una forma sencilla que devuelva los valores de Enum como una lista de cadenas, como:
List<String> sEnum = getEnumValuesAsString();
Konstantin Yovkov
Puedes hacer (antes de Java 8):
List<Enum> enumValues = Arrays.asList(Enum.values());
o
List<Enum> enumValues = new ArrayList<Enum>(EnumSet.allOf(Enum.class));
Con las funciones de Java 8, puede asignar cada constante a su nombre:
List<String> enumNames = Stream.of(Enum.values())
.map(Enum::name)
.collect(Collectors.toList());
-
No. El uso de Streams en realidad puede mejorar el rendimiento, ya que se puede procesar en paralelo.
– Konstantín Yovkov
6 de abril de 2015 a las 5:53
-
También puedes acortar
asList(...).stream()
ligeramente usandoStream.of
oArrays.stream
.– Radiodef
6 de abril de 2015 a las 5:56
-
@kocko: Eso es una simplificación excesiva. Para pequeñas cantidades de datos, los flujos generalmente tendrán una pequeña sobrecarga sobre los arreglos, y el uso de
parallel
puede significativamente herir actuación; la paralelización tiene un costo que no siempre es compensado por las ganancias.– Luis Wasserman
06/04/2015 a las 18:47
-
La primera y la segunda solución realmente no resuelven el problema, ya que OP solicita una matriz de cadenas como resultado. Entonces, ¿las corrientes son la única solución viable?
– kikovi
10 de enero de 2016 a las 22:25
-
Para unir los nombres en una cadena para que pueda registrarlos, reemplace el recopilador con
.collect(Collectors.joining(", "))
.– Noúmeno
29 de junio de 2017 a las 23:53
Rafa
También podrías hacer algo de la siguiente manera.
public enum DAY {MON, TUES, WED, THU, FRI, SAT, SUN};
EnumSet.allOf(DAY.class).stream().map(e -> e.name()).collect(Collectors.toList())
o
EnumSet.allOf(DAY.class).stream().map(DAY::name).collect(Collectors.toList())
La razón principal por la que me topé con esta pregunta es que quería escribir un validador genérico que valide si un nombre de enumeración de cadena determinado es válido para un tipo de enumeración determinado (Compartir en caso de que alguien lo encuentre útil).
Para la validación, tuve que usar Apache's EnumUtils
biblioteca ya que el tipo de enumeración no se conoce en tiempo de compilación.
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void isValidEnumsValid(Class clazz, Set<String> enumNames) {
Set<String> notAllowedNames = enumNames.stream()
.filter(enumName -> !EnumUtils.isValidEnum(clazz, enumName))
.collect(Collectors.toSet());
if (notAllowedNames.size() > 0) {
String validEnumNames = (String) EnumUtils.getEnumMap(clazz).keySet().stream()
.collect(Collectors.joining(", "));
throw new IllegalArgumentException("The requested values '" + notAllowedNames.stream()
.collect(Collectors.joining(",")) + "' are not valid. Please select one more (case-sensitive) "
+ "of the following : " + validEnumNames);
}
}
Era demasiado perezoso para escribir un validador de anotación de enumeración como se muestra aquí https://stackoverflow.com/a/51109419/1225551
¿Qué significaría obtener un valor de enumeración como una cadena? ¿Quieres una lista de los nombres de las constantes de enumeración?
– usuario2357112
6 de abril de 2015 a las 5:45
@user2357112, valores como
list of String
– Suganthan Madhavan Pillai
6 de abril de 2015 a las 5:50
Eso no responde la pregunta. Los valores de enumeración no son cadenas.
– usuario2357112
6 de abril de 2015 a las 5:51
¿Podría mostrar cómo podría hacer esto sin Java 8?
– Radiodef
6 de abril de 2015 a las 5:57
@ user2357112 Estoy de acuerdo, los valores de enumeración no son cadenas, es de su propio tipo pero necesito la conversión
– Suganthan Madhavan Pillai
6 de abril de 2015 a las 8:40