Necesito crear un Set
con valores iniciales.
Set h = new HashSet();
h.add("a");
h.add("b");
¿Hay alguna forma de hacer esto en una sola línea de código? Por ejemplo, es útil para un campo estático final.
Necesito crear un Set
con valores iniciales.
Set h = new HashSet();
h.add("a");
h.add("b");
¿Hay alguna forma de hacer esto en una sola línea de código? Por ejemplo, es útil para un campo estático final.
Hay un atajo que uso que no es muy eficiente en términos de tiempo, pero cabe en una sola línea:
Set h = new HashSet<>(Arrays.asList("a", "b"));
Nuevamente, esto no es eficiente en términos de tiempo ya que estás construyendo un array, convirtiéndolo en una lista y utilizando esa lista para crear un conjunto.
Cuando inicializo conjuntos estáticos finales usualmente lo escribo de esta manera:
public static final String[] SET_VALUES = new String[] { "a", "b" };
public static final Set MY_SET = new HashSet<>(Arrays.asList(SET_VALUES));
Un poco menos feo y la eficiencia no importa para la inicialización estática.
Las literales de colección estaban programadas para Java 7, pero no llegaron. Así que nada automático aún.
Puedes usar el Sets
de guava:
Sets.newHashSet("a", "b", "c")
O puedes usar la siguiente sintaxis, que creará una clase anónima, pero es un poco hacky:
Set h = new HashSet() {{
add("a");
add("b");
}};
Hay algunas formas:
Inicialización de doble llave
Esta es una técnica que crea una clase interna anónima con un inicializador de instancia que agrega String
s a sí mismo cuando se crea una instancia:
Set s = new HashSet() {{
add("a");
add("b");
}}
Tenga en cuenta que esto realmente creará una nueva subclase de HashSet
cada vez que se use, aunque no sea necesario escribir explícitamente una nueva subclase.
Un método de utilidad
Escribir un método que devuelva un Set
inicializado con los elementos deseados no es demasiado difícil de escribir:
public static Set newHashSet(String... strings) {
HashSet set = new HashSet();
for (String s : strings) {
set.add(s);
}
return set;
}
El código anterior solo permite el uso de un String
, pero no debería ser demasiado difícil permitir el uso de cualquier tipo utilizando genéricos.
Usar una biblioteca
Muchas bibliotecas tienen un método de conveniencia para inicializar objetos de colección.
Por ejemplo, Google Collections tiene un Sets.newHashSet(T...)
método que poblara un HashSet
con elementos de un tipo específico.
Una generalización de la función de utilidad de la respuesta de la respuesta de coobird para crear nuevos HashSet
:
public static Set newHashSet(T... objs) {
Set set = new HashSet();
for (T o : objs) {
set.add(o);
}
return set;
}
Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.