Je recherche un moyen très simple de créer un ensemble.
Arrays.asList("a", "b" ...)
crée un List<String>
Y a-t-il quelque chose de similaire pour Set
?
Je recherche un moyen très simple de créer un ensemble.
Arrays.asList("a", "b" ...)
crée un List<String>
Y a-t-il quelque chose de similaire pour Set
?
Réponses:
Désormais, avec Java 8, vous pouvez le faire sans avoir besoin d'un framework tiers:
Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());
Voir les collectionneurs .
Prendre plaisir!
En utilisant Guava , c'est aussi simple que cela:
Set<String> mySet = ImmutableSet.<String> of("a", "b");
Ou pour un ensemble mutable:
Set<String> mySet = Sets.newHashSet("a", "b")
Pour plus de types de données, consultez le guide de l'utilisateur de Guava
Sets.newHashSet("a", "b")
orSets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet()
n'existe pas avec cette signature, désolé
Set<String> mySet = ImmutableSet.of("a", "b");
Vous pourriez utiliser
new HashSet<String>(Arrays.asList("a","b"));
Pour les cas particuliers des ensembles avec zéro ou un membre, vous pouvez utiliser:
java.util.Collections.EMPTY_SET
et:
java.util.Collections.singleton("A")
java.util.Collections.emptySet()
est, dans mon esprit, préféré à EMPTY_SET, en raison de la sécurité du type. D'après les commentaires de la classe Collections:Unlike the like-named field, this method is parameterized.
Comme d'autres l'ont dit, utilisez:
new HashSet<String>(Arrays.asList("a","b"));
La raison pour laquelle cela n'existe pas en Java est que Arrays.asList
renvoie une liste de taille fixe, en d'autres termes:
public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}
Retour:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
Il n'y a pas d'implémentation JDK d'une "taille fixe" Set
à l'intérieur de la Arrays
classe. Pourquoi vous voulez ceci? A Set
garantit qu'il n'y a pas de doublons, mais si vous les tapez à la main, vous ne devriez pas avoir besoin de cette fonctionnalité ... et List
a plus de méthodes. Les deux interfaces étendent Collection
et Iterable
.
Comme d'autres l'ont dit, utilisez goyave si vous voulez vraiment cette fonctionnalité - car elle n'est pas dans le JDK. Regardez leurs réponses (en particulier la réponse de Michael Schmeißer) pour plus d'informations à ce sujet.
Dans Java 9, une fonction similaire a été ajoutée via des méthodes d'usine:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(Il existe également des équivalents List
.)
Non mais tu peux le faire comme ça
new HashSet<String>(Arrays.asList("a", "b", ...));
Voici une petite méthode que vous pouvez utiliser
/**
* 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));
}
Une autre façon de le faire en utilisant Java 8 et les énumérations serait:
Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
Voir EnumSet .
Je recommanderais une analyse des performances entre cette approche et
Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
car si vous avez plus de cinq éléments, le javadoc de la méthode indique que cela peut être des problèmes de performances comme vous pouvez le voir dans le javadoc de Set.Of (E, E ...) .