web-dev-qa-db-fra.com

Est-ce que .asSet (...) existe dans une API?

Je cherche 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?

81
cahen

Maintenant, 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 Collectionneurs .

Prendre plaisir!

41
Mr. Anderson

Avec 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, voir le guide de l'utilisateur Guava

56

Vous pourriez utiliser

new HashSet<String>(Arrays.asList("a","b"));
44
Dev Blanked

Pour les cas spéciaux d'ensembles avec zéro ou un membre, vous pouvez utiliser:

Java.util.Collections.EMPTY_SET

et:

Java.util.Collections.singleton("A")
20
Samuel Edwin Ward

Comme d'autres l'ont dit, utilisez:

new HashSet<String>(Arrays.asList("a","b"));

La raison pour laquelle not n'existe pas en Java est que Arrays.asList renvoie une liste de taille fixe, autrement dit:

public static void main(String a[])
{
  List<String> myList = Arrays.asList("a", "b");
  myList.add("c");
}

Résultats:

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 dans la classe Arrays. Pourquoi vous voulez ceci? Un Set garantit qu'il n'y a pas de doublons, mais si vous les saisissez manuellement, 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 déjà dit, utilisez goyave Si vous voulez vraiment cette fonctionnalité - puisqu'elle ne se trouve pas dans le JDK. Regardez leurs réponses (en particulier celle de Michael Schmeißer) pour plus d'informations à ce sujet.

14
durron597

En Java 9, une fonction similaire a été ajoutée via les méthodes d'usine: 

Set<String> oneLinerSet = Set.of("a", "b", ...);

(Il existe également des équivalents pour List.)

6
Holly Cummins

En goyave vous pouvez utiliser

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

newHashSet

2
OscarRyz

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));
  }
2
Stuart Clark

Non mais tu peux le faire comme ça

new HashSet<String>(Arrays.asList("a", "b", ...));
2

Une autre façon de le faire en utilisant Java 8 et les enums serait:

Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);

Voir EnumSet .

Je recommanderais une analyse de performance 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 des problèmes de performances, comme vous pouvez le constater dans le javadoc de Set.Of (E, E ...) .

0
Philippe Gioseffi