Qual é a maneira mais fácil de converter um List
para um Set
em Java?
java
collections
OHHAI
fonte
fonte
Set
e qualMap
delas está sendo usada;HashSet
é assumido aqui.Concordo com o sepp2k, mas existem outros detalhes que podem ser importantes:
fornecerá um conjunto não classificado que não possui duplicatas. Nesse caso, a duplicação é identificada usando o método .equals () em seus objetos. Isso é feito em combinação com o método .hashCode (). (Para mais informações sobre igualdade, veja aqui )
Uma alternativa que fornece um conjunto classificado é:
Isso funciona se o Foo implementa Comparable. Caso contrário, convém usar um comparador:
Isso depende de compareTo () (da interface comparável) ou compare () (do comparador) para garantir a exclusividade. Portanto, se você se preocupa apenas com a exclusividade, use o HashSet. Se você estiver após a classificação, considere o TreeSet. (Lembre-se: otimizar mais tarde!) Se a eficiência do tempo interessar, use um HashSet se a eficiência do espaço importar, consulte o TreeSet. Observe que implementações mais eficientes de Set e Map estão disponíveis no Trove (e em outros locais).
fonte
Se você usa a biblioteca Guava :
ou melhor:
fonte
ImmutableSet.of()
, por exemplo. EDIT: pode não ser um fator, porque todas as sobrecargas são desnecessárias.Usando o java 8, você pode usar o stream:
fonte
ou exemplo completo
fonte
Eu faria uma verificação nula antes de converter para definir.
fonte
Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
Você pode converter
List<>
paraSet<>
fonte
Para Java 8 é muito fácil:
fonte
new ArrayList<>()
;-)Java - addAll
Java - novo Objeto
Java-8
Usando o Guva
Apache Commons
Java 10
fonte
Não vamos esquecer nosso amigo relativamente novo, java-8API de fluxo. Se você precisar pré-processar a lista antes de convertê-la em um conjunto, é melhor ter algo como:
fonte
A melhor maneira de usar o construtor
No java 8, você também pode usar a API do stream:
fonte
Existem várias maneiras de obter um
Set
como:Quando usamos
Collectors.toSet()
ele retorna um conjunto e de acordo com o doc:There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
. Se quisermos obter umHashSet
, podemos usar a outra alternativa para obter um conjunto (verificaçãoset3
).fonte
Com o Java 10, agora você pode usar
Set#copyOf
para converter facilmente umList<E>
em um não modificávelSet<E>
:Exemplo:
Lembre-se de que esta é uma operação não ordenada e que
null
elementos não são permitidos, pois isso gera aNullPointerException
.Se você deseja que seja modificável, basta passá-lo ao construtor uma
Set
implementação.fonte
Uma solução mais resistente ao Java 8 com
Optional.ofNullable
fonte
Se você usar o Eclipse Collections :
A
MutableSet
interface se estendejava.util.Set
enquanto aMutableIntSet
interface não. Você também pode converter qualquerIterable
um emSet
usando aSets
classe de fábrica.Há mais explicações sobre as fábricas mutáveis disponíveis nas Coleções Eclipse aqui .
Se você deseja um
ImmutableSet
de aList
, pode usar aSets
fábrica da seguinte maneira:Nota: Eu sou um confirmador das Coleções Eclipse
fonte
Lembre-se de que a conversão de Lista em Conjunto removerá duplicatas da coleção, pois a Lista suporta duplicatas, mas o Conjunto não suporta duplicatas em Java.
Conversão direta: a maneira mais comum e simples de converter uma lista em um conjunto
Coleções do Apache Commons: Você também pode usar a API do Commons Collections para converter uma lista em um conjunto: -
Usando Stream: Outra maneira é converter a lista fornecida em stream e depois transmitir para definir: -
fonte