traduccion - java collections example
Cómo copiar un java.util.List en otro java.util.List (13)
Traté de hacer algo como esto, pero todavía tengo una excepción IndexOutOfBoundsException.
Recibí una ConcurrentAccessException
Esto significa que está modificando la lista mientras intenta copiarla, muy probablemente en otro hilo. Para arreglar esto tienes que
use una colección que está diseñada para acceso concurrente.
bloquear la colección de forma adecuada para que pueda iterar sobre ella (o permitirle llamar a un método que hace esto por usted)
encuentre una distancia para evitar tener que copiar la lista original.
Tengo una List<SomeBean>
que se completa desde un servicio web. Quiero copiar / clonar el contenido de esa lista en una lista vacía del mismo tipo. Una búsqueda en Google para copiar una lista me sugirió usar el método Collections.copy()
. En todos los ejemplos que vi, se suponía que la lista de destinos contenía la cantidad exacta de elementos para que se realizara la copia.
Como la lista que estoy usando se completa a través de un servicio web y contiene cientos de objetos, no puedo usar la técnica anterior. O lo estoy usando mal? !! De todos modos, para que funcione, traté de hacer algo como esto, pero todavía tengo una IndexOutOfBoundsException
.
List<SomeBean> wsList = app.allInOne(template);
List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());
Traté de usar wsListCopy=wsList.subList(0, wsList.size())
pero obtuve una ConcurrentAccessException
más adelante en el código. Hit y prueba. :)
De todos modos, mi pregunta es simple, ¿cómo puedo copiar todo el contenido de mi lista en otra lista? No a través de la iteración, por supuesto.
En Java 10 :
List<T> newCopy = List.copyOf(anotherList);
List.copyOf(...)
devuelve una Lista no modificable que contiene los elementos de la Colección dada.
La colección dada no debe ser nula y no debe contener ningún elemento nulo .
Esta es una muy buena forma de Java 8 para hacerlo:
List<String> list2 = list1.stream().collect(Collectors.toList());
Por supuesto, la ventaja aquí es que puede filtrar y omitir para copiar solo parte de la lista.
p.ej
//don''t copy the first element
List<String> list2 = list1.stream().skip(1).collect(Collectors.toList());
Estaba teniendo el mismo problema ConcurrentAccessException y mysolution fue para:
List<SomeBean> tempList = new ArrayList<>();
for (CartItem item : prodList) {
tempList.add(item);
}
prodList.clear();
prodList = new ArrayList<>(tempList);
Por lo tanto, funciona solo una operación en el momento y evita la Excepción ...
Hay otro método con Java 8 de una manera nula.
List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
.map(List::stream)
.orElseGet(Stream::empty)
.collect(Collectors.toList());
Si quiere omitir un elemento.
List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
.map(List::stream)
.orElseGet(Stream::empty)
.skip(1)
.collect(Collectors.toList());
Intenté algo similar y pude reproducir el problema (IndexOutOfBoundsException). A continuación están mis hallazgos:
1) La implementación de Collections.copy (destList, sourceList) comprueba primero el tamaño de la lista de destinos llamando al método size (). Como la llamada al método size () siempre devolverá el número de elementos en la lista (0 en este caso), el constructor ArrayList (capacidad) asegura solo la capacidad inicial de la matriz de respaldo y esto no tiene ninguna relación con el tamaño de la lista. Por lo tanto, siempre obtenemos IndexOutOfBoundsException.
2) Una forma relativamente simple es usar el constructor que toma una colección como su argumento:
List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList);
No puedo ver ninguna respuesta correcta. Si desea una copia profunda, debe iterar y copiar el objeto manualmente (puede usar un constructor de copia).
Puede usar addAll ().
por ejemplo: wsListCopy.addAll(wsList);
Si necesita copiar parte de la lista
List<String> list2 = itemList.subList(0, 9);
Solo usa esto:
List<SomeBean> newList = new ArrayList<SomeBean>(otherList);
Nota: aún no es seguro para hilos, si modifica otherList
de otro hilo, entonces puede hacer que otherList
(e incluso newList
) un CopyOnWriteArrayList
, por ejemplo, o usar una primitiva de bloqueo, como ReentrantReadWriteLock para serializar el acceso de lectura / escritura a cualquier lista a la que se acceda simultáneamente.
la función sublista es un truco, el objeto devuelto todavía está en la lista original. por lo tanto, si realiza alguna operación en subList, causará la excepción simultánea en su código, sin importar si se trata de un solo hilo o multi hilo.
re: indexOutOfBoundsException
, tus indexOutOfBoundsException
sublista son el problema; necesita finalizar la sublista en tamaño-1. Siendo de base cero, el último elemento de una lista es siempre size-1, no hay ningún elemento en la posición de tamaño, de ahí el error.
originalArrayList.addAll(copyArrayofList);
Tenga en cuenta que cada vez que use el método addAll () para copiar, el contenido de las listas de matrices (originalArrayList y copyArrayofList) se agregarán a la lista, de modo que si modifica alguno de ellos, también copiarArrayofList también reflejar el mismo cambio
Si no desea efectos colaterales, debe copiar cada elemento de la lista de arreglos original a copyArrayofList, como usar un ciclo for o while.