Estou procurando uma maneira muito simples de criar um Conjunto.
Arrays.asList("a", "b" ...)
cria um List<String>
Existe algo semelhante para Set
?
Estou procurando uma maneira muito simples de criar um Conjunto.
Arrays.asList("a", "b" ...)
cria um List<String>
Existe algo semelhante para Set
?
Respostas:
Agora, com o Java 8, você pode fazer isso sem a necessidade de uma estrutura de terceiros:
Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());
Veja Coletores .
Aproveitar!
Usando Guava , é tão simples quanto isso:
Set<String> mySet = ImmutableSet.<String> of("a", "b");
Ou para um conjunto mutável:
Set<String> mySet = Sets.newHashSet("a", "b")
Para obter mais tipos de dados, consulte o guia do usuário Guava
Sets.newHashSet("a", "b")
ouSets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet()
não existe com essa assinatura, desculpe
Set<String> mySet = ImmutableSet.of("a", "b");
Você poderia usar
new HashSet<String>(Arrays.asList("a","b"));
Para os casos especiais de conjuntos com zero ou um membro, você pode usar:
java.util.Collections.EMPTY_SET
e:
java.util.Collections.singleton("A")
java.util.Collections.emptySet()
é, em minha opinião, preferível a EMPTY_SET, devido à segurança de tipo. Dos comentários na classe Coleções:Unlike the like-named field, this method is parameterized.
Como já foi dito, use:
new HashSet<String>(Arrays.asList("a","b"));
A razão pela qual isso não existe em Java é que Arrays.asList
retorna uma lista de tamanho fixo, em outras palavras:
public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}
Retorna:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
Não há implementação JDK de um "tamanho fixo" Set
dentro da Arrays
classe. Por que voce quer isso? A Set
garante que não haja duplicatas, mas se você as estiver digitando manualmente, não precisará dessa funcionalidade ... e List
tem mais métodos. Ambas as interfaces estendem Collection
e Iterable
.
Como outros já disseram, use goiaba se você realmente deseja esta funcionalidade - já que não está no JDK. Veja as respostas deles (em particular a resposta de Michael Schmeißer) para obter informações sobre isso.
No Java 9, uma função semelhante foi adicionada por meio de métodos de fábrica:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(Existem equivalentes para List
também.)
Não, mas você pode fazer assim
new HashSet<String>(Arrays.asList("a", "b", ...));
Aqui está um pequeno método que você pode usar
/**
* Utility method analogous to {@link java.util.Arrays#asList(Object[])}
*
* @param ts
* @param <T>
* @return the set of all the parameters given.
*/
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> Set<T> asSet(T... ts) {
return new HashSet<>(Arrays.asList(ts));
}
Outra maneira de fazer isso usando Java 8 e enums seria:
Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
Veja EnumSet .
Eu recomendaria uma análise de desempenho entre esta abordagem e
Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
porque se você tiver mais de cinco elementos, o javadoc do método indica que podem ser problemas de desempenho, como você pode ver no javadoc de Set.Of (E, E ...) .