Inicialización de HashSet en el momento de la construcción

1. Información general

En este tutorial rápido, presentaremos varios métodos para inicializar el HashSet con valores, en el momento de su construcción .

Si, en cambio, está buscando explorar las características de HashSet , consulte este artículo principal aquí.

Nos sumergiremos en los métodos integrados de Java desde Java 5 y antes, seguidos de un nuevo mecanismo introducido desde Java 8 . También veremos un método de utilidad personalizado y finalmente exploraremos las funciones proporcionadas por bibliotecas de colecciones de terceros , Google Guava en particular.

Si tiene suerte de haber migrado ya a JDK9 +, simplemente puede usar métodos de fábrica de colecciones.

2. Métodos integrados de Java

Comencemos examinando tres mecanismos integrados disponibles desde Java 5 o antes .

2.1. Usar otra instancia de colección

Podemos pasar una instancia existente de otra colección para inicializar el conjunto . En el siguiente ejemplo, estamos usando una lista creada en línea :

Set set = new HashSet(Arrays.asList("a", "b", "c"));

2.2. Usar clase anónima

En otro enfoque, podemos usar la clase anónima para agregar un elemento a HashSet .

Tenga en cuenta el uso de llaves dobles. Este enfoque es técnicamente muy caro, ya que crea una clase anónima cada vez que se llama.

Entonces, dependiendo de la frecuencia con la que necesitemos inicializar Set , podemos intentar evitar el uso de este enfoque:

Set set = new HashSet(){{ add("a"); add("b"); add("c"); }};

2.3. Uso del método de utilidad de colecciones desde Java 5

La clase de utilidad Colecciones de Java proporciona el método denominado singleton para crear un conjunto con un solo elemento . La instancia de Set creada con el método singleton es inmutable, lo que significa que no podemos agregarle más valores.

Hay situaciones especialmente en las pruebas unitarias en las que necesitamos crear un conjunto con un solo valor:

Set set = Collections.singleton("a");

3. Definición del método de utilidad personalizado

Podemos definir un método final estático como se muestra a continuación. El método acepta argumentos variables .

El uso de Collections.addAll que acepta el objeto de colección y una matriz de valores es mejor entre otros debido a la baja sobrecarga de copiar valores.

El método utiliza genéricos para que podamos pasar valores de cualquier tipo:

public static final  Set newHashSet(T... objs) { Set set = new HashSet(); Collections.addAll(set, objs); return set; }

El método de utilidad se puede utilizar en nuestro código como se muestra a continuación.

Set set = newHashSet("a","b","c");

4. Uso de Stream desde Java 8

Con la introducción de Stream API en Java 8, tenemos opciones adicionales. Podemos usar Stream with Collectors como se muestra en el siguiente código:

Set set = Stream.of("a", "b", "c") .collect(Collectors.toCollection(HashSet::new));

5. Uso de la biblioteca de colecciones de terceros

Hay varias bibliotecas de colecciones de terceros, incluidas Google Guava, Apache Commons Collections y Eclipse Collections, solo por nombrar algunas.

Estas bibliotecas proporcionan métodos de utilidad convenientes para inicializar colecciones como Set. Dado que Google Guava es uno de los más utilizados aquí, tenemos un ejemplo. La Guava tiene métodos convenientes para objetos Set mutables e inmutables :

Set set = Sets.newHashSet("a", "b", "c");

De manera similar, Guava tiene una clase de utilidad para crear instancias de Set inmutables , como podemos ver en el siguiente ejemplo.

Set set = ImmutableSet.of("a", "b", "c");

6. Conclusión

En conclusión, vimos varias formas en las que se puede inicializar un HashSet mientras se construye. Estos enfoques no necesariamente cubren todas las formas posibles de ninguna manera. Fue solo un intento de mostrar las formas más comunes.

Uno de esos enfoques que no se tratan aquí podría ser utilizar el generador de objetos para construir un conjunto .

Como siempre, el ejemplo de código de trabajo está disponible en GitHub.