Estoy buscando una forma muy sencilla de crear un conjunto.
Arrays.asList("a", "b" ...)
crea un List<String>
¿Hay algo similar para Set
?
Estoy buscando una forma muy sencilla de crear un conjunto.
Arrays.asList("a", "b" ...)
crea un List<String>
¿Hay algo similar para Set
?
Respuestas:
Ahora con Java 8 puedes hacer esto sin necesidad de un marco de terceros:
Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());
Ver coleccionistas .
¡Disfrutar!
Usando Guava , es tan simple como eso:
Set<String> mySet = ImmutableSet.<String> of("a", "b");
O para un conjunto mutable:
Set<String> mySet = Sets.newHashSet("a", "b")
Para obtener más tipos de datos, consulte la guía del usuario de Guava
Sets.newHashSet("a", "b")
oSets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet()
no existe con esa firma, lo siento
Set<String> mySet = ImmutableSet.of("a", "b");
Podrías usar
new HashSet<String>(Arrays.asList("a","b"));
Para los casos especiales de conjuntos con cero o un miembro, puede utilizar:
java.util.Collections.EMPTY_SET
y:
java.util.Collections.singleton("A")
java.util.Collections.emptySet()
es, en mi opinión, preferido sobre EMPTY_SET, debido a la seguridad de tipos. De los comentarios en la clase Colecciones:Unlike the like-named field, this method is parameterized.
Como han dicho otros, use:
new HashSet<String>(Arrays.asList("a","b"));
La razón por la que esto no existe en Java es que Arrays.asList
devuelve una lista de tamaño fijo, en otras palabras:
public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}
Devoluciones:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
No existe una implementación JDK de un "tamaño fijo" Set
dentro de la Arrays
clase. ¿Por qué quieres esto? A Set
garantiza que no hay duplicados, pero si los está escribiendo a mano, no debería necesitar esa funcionalidad ... y List
tiene más métodos. Ambas interfaces amplían Collection
y Iterable
.
Como han dicho otros, use guava si realmente desea esta funcionalidad, ya que no está en el JDK. Mire sus respuestas (en particular la respuesta de Michael Schmeißer) para obtener información al respecto.
En Java 9, se ha agregado una función similar a través de métodos de fábrica:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(También hay equivalentes para List
).
No, pero puedes hacerlo así
new HashSet<String>(Arrays.asList("a", "b", ...));
Aquí tienes un pequeño método que puedes 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));
}
Otra forma de hacerlo usando Java 8 y enumeraciones sería:
Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
Ver EnumSet .
Recomendaría un análisis de desempeño entre este enfoque y
Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
porque si tienes más de cinco elementos, el javadoc del método indica que pueden ser problemas de rendimiento como puedes ver en el javadoc de Set.Of (E, E ...) .