Tengo una matriz que me gustaría convertir en una List
para modificar el contenido de la matriz.
Desbordamiento de la pila tiene un montón de preguntas / respuestas que la dirección Arrays.asList()
y la forma en que sólo proporciona una vista de lista de la matriz subyacente, y cómo tratar de manipular la lista resultante generalmente lanzar una UnsupportedOperationException
como los métodos utilizados para manipular la lista (por ejemplo add()
, remove()
, etc.) son no implementado por la implementación de List proporcionada por Arrays.asList()
.
Pero no puedo encontrar un ejemplo de cómo convertir una matriz en una Lista mutable. Supongo que puedo recorrer la matriz y put()
cada valor en una nueva Lista, pero me pregunto si existe una interfaz para hacer esto por mí.
Y si está utilizando las API de colección de Google
fuente
new ArrayList<>(Arrays.asList(...))
los dos : el javadoc para el método implica que quedará obsoleto porque no es lo suficientemente útil.Este código simple que usa la API Stream incluida en Java 8 crea una lista mutable (o vista) que contiene los elementos de su matriz:
Foo[] array = ...; List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
O, igualmente válido:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
fuente
Si está usando Eclipse Collections (anteriormente GS Collections ), puede usar
FastList.newListWith(...)
oFastList.wrapCopy(...)
.Ambos métodos toman varargs, por lo que puede crear la matriz en línea o pasar una matriz existente.
MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4); Integer[] array2 = {1, 2, 3, 4}; MutableList<Integer> list2 = FastList.newListWith(array2);
La diferencia entre los dos métodos es si la matriz se copia o no.
newListWith()
no copia la matriz y, por lo tanto, lleva un tiempo constante. Debe evitar usarlo si sabe que la matriz podría estar mutada en otro lugar.Integer[] array2 = {1, 2, 3, 4}; MutableList<Integer> list2 = FastList.newListWith(array2); array2[1] = 5; Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2); Integer[] array3 = {1, 2, 3, 4}; MutableList<Integer> list3 = FastList.wrapCopy(array3); array3[1] = 5; Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);
Nota: Soy un comprometido con las colecciones de Eclipse.
fuente
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));
fuente
myNewArrayList = new ArrayList(...)
, es decir, el tipo sin formato? Hay una diferencia entre "usar el operador de diamante para permitir que el compilador desarrolle un argumento de tipo" y "usar un tipo sin formato".Agregando otra opción usando Streams API:
fuente