.AsSet (…) esiste in qualche API?


Risposte:


84

Ora con Java 8 puoi farlo senza bisogno di framework di terze parti:

Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());

Vedi Collezionisti .

Godere!


4
Al giorno d'oggi con Java 8 questa è probabilmente la risposta migliore perché non dipende da librerie di terze parti e può essere facilmente adattata ad altri tipi di raccolte, quindi lo sto impostando come accettato. Mille grazie a tutti per le altre fantastiche soluzioni. (a proposito, questo set è modificabile)
— cahen

3
Ora, chi ha detto che Java era troppo prolisso? Ovviamente questa è la risposta migliore!
— BobDoolittle

Grazie mille @BobDoolittle!
— Mr. Anderson

2
Per chiunque utilizzi java 9+, vedere anche la risposta di Holly di seguito: stackoverflow.com/a/48025159/229743
— Taylor

1
risposta impeccabile Mr. Anderson!
— gaurav

63

Usando Guava , è così semplice:

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

O per un set mutevole:

Set<String> mySet = Sets.newHashSet("a", "b")

Per altri tipi di dati vedere la guida utente Guava


Esiste una versione non immutabile di questo?
— cahen

3
@cahen yes: Sets.newHashSet("a", "b")orSets.newLinkedHashSet("a", "b")
— Sean Patrick Floyd

1
Ho aggiunto una variante mutevole alla risposta.
— Michael Schmeißer

in realtà, Sets.newLinkedHashSet()non esiste con quella firma, mi dispiace
— Sean Patrick Floyd

Sono stato in grado di rimuovere uno degli argomenti del tipo:Set<String> mySet = ImmutableSet.of("a", "b");
— joshden

55

Potresti usare

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

Preferirei farlo quindi utilizzare la versione stream. Posso semplicemente importare staticamente "asList", rendendolo ancora meno dettagliato.
— Marcio Lucca

24

Per i casi speciali di insiemi con zero o un membro, è possibile utilizzare:

java.util.Collections.EMPTY_SET

e:

java.util.Collections.singleton("A")

per questi casi speciali, è probabilmente la soluzione migliore in quanto utilizza l'API java.util standard
— arcuri82

2
java.util.Collections.emptySet()è, a mio avviso, preferito rispetto a EMPTY_SET, a causa della sicurezza dei tipi. Dai commenti nella classe Collezioni:Unlike the like-named field, this method is parameterized.
— Eddified

17

Come altri hanno già detto, usa:

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

Il motivo per cui questo non esiste in Java è che Arrays.asListrestituisce un elenco di dimensioni fisse, in altre parole:

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

Ritorna:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)

Non esiste un'implementazione JDK di una "dimensione fissa" Setall'interno della Arraysclasse. Perché vuoi questo? A Setgarantisce che non ci siano duplicati, ma se li stai digitando a mano, non dovresti aver bisogno di quella funzionalità ... e Listha più metodi. Entrambe le interfacce estendono Collectione Iterable.


Come altri hanno già detto, usa guava se vuoi davvero questa funzionalità, poiché non è nel JDK. Guarda le loro risposte (in particolare la risposta di Michael Schmeißer) per informazioni al riguardo.


3
Questa è la risposta migliore fino ad ora, perché indica cosa fa effettivamente Arrays.asList (). Molti sviluppatori sembrano credere che Arrays.asList () crei un java.util.ArrayList, mentre in realtà crea un java.util.Arrays $ ArrayList (che è solo parzialmente modificabile e una visualizzazione live dell'array sottostante)
— Sean Patrick Floyd

1
Per quanto riguarda il motivo per cui qualcuno vorrebbe farlo, il motivo più comune per costruire un Set (o List) a mano è in una classe di test in cui si passano i valori di test.
— Scott McIntyre

14

In Java 9, una funzione simile è stata aggiunta tramite metodi di fabbrica:

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

(Ci sono anche equivalenti per List.)


Ho provato questo e ho ricevuto un avviso dal compilatore che questo non è un metodo API.
— Philippe Gioseffi

Ecco il documento java pertinente: docs.oracle.com/javase/9/docs/api/java/util/Set.html . Oltre a utilizzare un JDK Java 9+, potrebbe essere necessario regolare l'IDE o lo strumento di compilazione per utilizzare la conformità a Java 9 (ad esempio, per Maven, sarebbero passaggi simili a quelli qui, ma impostati su 1.9: stackoverflow.com/ domande / 16798066 /… )
— Holly Cummins

Vorrei poter usare Java 9 .. Viviamo nel passato! :(
— jDub9

va bene, ma hanno alcune restrizioni sulla dimensione degli argomenti ...
— Radoslav Ivanov



2

Ecco un piccolo metodo che puoi usare

  /**
   * 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));
  }

1

Un altro modo per farlo usando Java 8 e le enumerazioni sarebbe:

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

Vedi EnumSet .

Suggerirei un'analisi delle prestazioni tra questo approccio e

Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());

perché se hai più di cinque elementi il ​​javadoc del metodo afferma che potrebbero essere problemi di prestazioni come puoi vedere nel javadoc di Set.Of (E, E ...) .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.