Estoy usando este código para convertir Seta a List:
Map<String, List<String>> mainMap = new HashMap<>();
for (int i=0; i < something.size(); i++) {
  Set<String> set = getSet(...); //returns different result each time
  List<String> listOfNames = new ArrayList<>(set);
  mainMap.put(differentKeyName, listOfNames);
}Quiero evitar crear una nueva lista en cada iteración del bucle. ¿Es eso posible?
                    
                        java
                                performance
                                list
                                set
                                
                    
                    
                        Muhammad Imran Tariq
fuente
                
                fuente

Respuestas:
Puede usar el método List.addAll () . Acepta una Colección como argumento, y su conjunto es una Colección.
EDITAR: como responder a la edición de la pregunta.
Es fácil ver que si desea tener a
MapconLists como valores, para tener k valores diferentes, necesita crear k listas diferentes.Por lo tanto: no puede evitar crear estas listas, las listas deberán crearse.
Posible
solución : declare su
Mapcomo aMap<String,Set>o en suMap<String,Collection>lugar, e inserte su conjuntofuente
differentKeyNamecambiando cada iteración? ¿Realmente quieressomething.size()diferentes valores posibles en tus mapas? Es fácil ver que un mapa conklistas como valores necesita crear al menosklistas.Use el constructor para convertirlo:
fuente
También desde la biblioteca Guava Collect, puede usar
newArrayList(Collection):Esto sería muy similar a la respuesta anterior de amit , excepto que no necesita declarar (o instanciar) ningún
listobjeto.fuente
ArrayListconstructor.new ArrayList<>([your_set]).Podemos usar el siguiente trazador de líneas en Java 8:
Aquí hay un pequeño ejemplo:
fuente
Quería una forma muy rápida de convertir mi conjunto a Lista y devolverlo, así que en una línea lo hice
fuente
Puede usar este cambio de una línea:
Arrays.asList(set.toArray(new Object[set.size()]))fuente
Yo lo haría :
fuente
Como no se ha mencionado hasta ahora, a partir de Java 10 puede usar el nuevo
copyOfmétodo de fábrica:Del Javadoc :
fuente
Java 8 ofrece la opción de usar transmisiones y puede obtener una lista de la
Set<String> setStringsiguiente manera:Aunque la implementación interna a partir de ahora proporciona una instancia de
ArrayList:pero JDK no lo garantiza. Como se menciona aquí :
En caso de que quiera estar seguro siempre, puede solicitar una instancia específicamente como:
fuente
Creo un
staticmétodo simple :... o si desea establecer el tipo de Lista, puede usar:
fuente
Recientemente encontré esto:
fuente
public static <T> ArrayList<T> list(Enumeration<T> e) { ArrayList<T> l = new ArrayList<>(); while (e.hasMoreElements()) l.add(e.nextElement()); return l; }En aras de la exhaustividad...
Digamos que usted realmente hacer desea tratar los
MapvaloresLists, pero se quiere evitar copiar elSeten unaListcada vez.Por ejemplo, tal vez estás llamando a una función de biblioteca que crea una
Set, pero estás pasando tuMap<String, List<String>>resultado a una función de biblioteca (mal diseñada pero fuera de tu alcance) que solo tomaMap<String, List<String>>, aunque de alguna manera sabes que las operaciones que realiza conLists son igualmente aplicables a cualquieraCollection(y por lo tanto a cualquieraSet). Y por alguna razón , debe evitar la sobrecarga de velocidad / memoria de copiar cada Conjunto en una Lista.En este caso de súper nicho, dependiendo del comportamiento (tal vez desconocido) que la función de biblioteca necesita de su
Listcorreo electrónico, puede crear unaListvista sobre cada Conjunto. Tenga en cuenta que esto es inherentemente inseguro (debido a que los requisitos de la función de biblioteca de cada unoListpodrían presumiblemente cambiar sin que usted lo sepa), por lo que debería preferirse otra solución. Pero así es como lo harías.Crearía una clase que implemente la
Listinterfaz, tome unSeten el constructor y asigne ese conjunto a un campo, y luego use ese internoSetpara implementar laListAPI (en la medida de lo posible y deseado).Tenga en cuenta que algunos comportamientos de la Lista que simplemente no podrá imitar sin almacenar los elementos como a
List, y algunos comportamientos que solo podrá imitar parcialmente. Nuevamente, esta clase no es un reemplazo seguro paraLists en general. En particular, si sabe que el caso de uso requiere operaciones relacionadas con el índice o MUTAR elList, este enfoque iría al sur muy rápido.fuente
Encontré esto funcionando bien y útil para crear una Lista a partir de un Conjunto.
fuente
fuente