Sto cercando un modo molto semplice per creare un set.
Arrays.asList("a", "b" ...)
crea un file List<String>
C'è qualcosa di simile per Set
?
Sto cercando un modo molto semplice per creare un set.
Arrays.asList("a", "b" ...)
crea un file List<String>
C'è qualcosa di simile per Set
?
Risposte:
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!
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
Sets.newHashSet("a", "b")
orSets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet()
non esiste con quella firma, mi dispiace
Set<String> mySet = ImmutableSet.of("a", "b");
Potresti usare
new HashSet<String>(Arrays.asList("a","b"));
Per i casi speciali di insiemi con zero o un membro, è possibile utilizzare:
java.util.Collections.EMPTY_SET
e:
java.util.Collections.singleton("A")
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.
Come altri hanno già detto, usa:
new HashSet<String>(Arrays.asList("a","b"));
Il motivo per cui questo non esiste in Java è che Arrays.asList
restituisce 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" Set
all'interno della Arrays
classe. Perché vuoi questo? A Set
garantisce che non ci siano duplicati, ma se li stai digitando a mano, non dovresti aver bisogno di quella funzionalità ... e List
ha più metodi. Entrambe le interfacce estendono Collection
e 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.
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
.)
No ma puoi farlo in questo modo
new HashSet<String>(Arrays.asList("a", "b", ...));
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));
}
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 ...) .