Inicializando o HashSet no momento da construção

Inicializando o HashSet no momento da construção

1. Visão geral

Neste tutorial rápido, apresentaremos vários métodos deinitializing the HashSet with values, at the time of its construction.

Se, em vez disso, você estiver procurando explorar os recursos deHashSet, consultethis core article here.

Vamos mergulhar em Javabuilt-in methods since Java 5 and before seguido por novomechanism introduced since Java 8. Também veremos umcustom utility methode, finalmente, exploraremos os recursos fornecidos por3rd party collection libraries, em particular pelo Google Guava.

Se você tiver sorte de já ter migrado para JDK9 +, pode simplesmente usarcollection factory methods.

2. Métodos internos do Java

Vamos começar examinando trêsmechanisms available since the Java 5 or before integrados.

2.1. Usando outra instância de coleção

Podemos passar uminstance of another collection existente para inicializar oSet. No exemplo abaixo, estamos usando umList criado em linha:

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

2.2. Usando classe anônima

Em outra abordagem, podemos usar a classe anônima para adicionar um elemento aHashSet.

Observe o uso de chaves duplas. Essa abordagem étechnically very expensive, pois cria uma classe anônima cada vez que é chamada.

Portanto, dependendo da frequência com que precisamos inicializarSet, podemostry to avoid using this approach:

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

2.3. Usando o método do utilitário de coleções desde o Java 5

A classeCollections utility do Java fornece o método chamadosingleton para criar umSet com um único elemento. A instânciaSet criada com o métodosingleton éimmutable, o que significa que não podemos adicionar mais valores a ele.

Existem situações especialmente em testes de unidade em que precisamos criar umSet com um único valor:

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

3. Definindo o método de utilitário personalizado

Podemos definir um métodostatic final conforme abaixo. O métodoaccepts variable arguments.

UsandoCollections.addAll, que aceita o objeto de coleção e uma matriz de valores, ébest among others devido ao baixo overhead de copiar valores.

Omethod is using generics para que possamos passar valores de qualquer tipo:

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

O método utilitário pode ser usado em nosso código como abaixo.

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

4. UsandoStream desde Java 8

Com a introdução da APIStream no Java 8, temos opções adicionais. Podemos usarStream with Collectors conforme mostrado no código a seguir:

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

5. Usando a biblioteca de coleção de terceiros

Existem várias bibliotecas de coleções de terceiros, incluindo Google Guava, Apache Commons Collections e Eclipse Collections, entre outras.

Essas bibliotecas fornecem métodos utilitários convenientes para inicializar coleções como Set. ComoGoogle Guava é um dos mais comumente usados ​​aqui, temos um exemplo dele. O Guava tem métodos convenientes para objetosSet mutáveis ​​e imutáveis:

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

Da mesma forma, o Guava possui uma classe de utilitário para a criação deimmutable Set instances, como podemos ver no exemplo abaixo.

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

6. Conclusão

Em conclusão, vimos várias maneiras nas quais aHashSet pode ser inicializado enquanto é construído. Essas abordagens não cobrem necessariamente todas as maneiras possíveis, de forma alguma. Foi apenas uma tentativa de mostrar as formas mais comuns.

Uma abordagem não coberta aqui pode ser usar o construtor de objeto para construir umSet.

Como sempre, está disponível um exemplo de código funcionalover on GitHub.