Conversión de matriz a lista en Java
¿Cómo convierto una matriz en una lista en Java?
Utilicé Arrays.asList()
pero el comportamiento (y la firma) de alguna manera cambiaron de Java SE 1.4.2 (documentos ahora en el archivo) a 8 y la mayoría de los fragmentos que encontré en la web usan el comportamiento 1.4.2.
Por ejemplo:
int[] numbers = new int[] { 1, 2, 3 };
Arrays.asList(numbers)
- en 1.4.2 devuelve una lista que contiene los elementos 1, 2, 3
- en 1.5.0+ devuelve una lista que contiene la matriz 'números'
En muchos casos debería ser fácil de detectar, pero en ocasiones puede pasar desapercibido:
Assert.assertTrue(Arrays.asList(numbers).indexOf(4) == -1);
En su ejemplo, es porque no puede tener una Lista de tipo primitivo. En otras palabras, List<int>
no es posible.
Sin embargo, puede utilizar List<Integer>
la Integer
clase que envuelve la int
primitiva. Convierta su matriz a List
con el Arrays.asList
método de utilidad.
Integer[] numbers = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(numbers);
Vea este código ejecutado en vivo en IdeOne.com .
En Java 8, puedes usar transmisiones:
int[] numbers = new int[] { 1, 2, 3 };
Arrays.stream(numbers)
.boxed()
.collect(Collectors.toList());
No podemos tener List<int>
un int
tipo primitivo así que solo podemos tener List<Integer>
.
Java 16
Java 16 introduce un nuevo método en Stream API llamado toList()
. Este práctico método devuelve una Lista no modificable que contiene los elementos de la secuencia. Entonces, intentar agregar un nuevo elemento a la lista simplemente conducirá a UnsupportedOperationException
.
int[] ints = new int[] {1,2,3,4,5};
Arrays.stream(ints).boxed().toList();
Java 8 (matriz int)
int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList());
Java 8 y versiones anteriores (matriz de enteros)
Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 = Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only
¿Necesita ArrayList y no List?
En caso de que queramos una implementación específica de, List
por ejemplo ArrayList
, podemos usar toCollection
como:
ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new));
¿ Por qué list21
no se puede modificar estructuralmente?
Cuando usamos Arrays.asList
el tamaño de la lista devuelta es fijo porque la lista devuelta no es java.util.ArrayList
, sino una clase estática privada definida en su interior java.util.Arrays
. Entonces, si agregamos o eliminamos elementos de la lista devuelta, UnsupportedOperationException
se arrojará un. Entonces deberíamos continuar list22
cuando queramos modificar la lista. Si tenemos Java8, también podemos utilizar list23
.
Para ser claros, list21
se puede modificar en el sentido de que podemos llamar, list21.set(index,element)
pero esta lista no se puede modificar estructuralmente, es decir, no se pueden agregar ni eliminar elementos de la lista. También puedes consultar esta respuesta mía para obtener más explicaciones.
Si queremos una lista inmutable, podemos ajustarla como:
List<Integer> list22 = Collections.unmodifiableList(Arrays.asList(integers));
Otro punto a tener en cuenta es que el método Collections.unmodifiableList
devuelve una vista no modificable de la lista especificada. Una colección de vistas no modificables es una colección que no se puede modificar y también es una vista de una colección de respaldo. Tenga en cuenta que aún es posible realizar cambios en la colección de respaldo y, si se producen, serán visibles a través de la vista no modificable.
Podemos tener una lista verdaderamente inmutable en Java 9 y 10.
Lista verdaderamente inmutable
Java 9:
String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);
Java 10 (lista verdaderamente inmutable):
Podemos usar List.of
lo introducido en Java 9. También de otras formas:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
Hablando de la forma de conversión, depende de por qué necesitas tu archivo List
. Si lo necesita solo para leer datos. OK aquí tienes:
Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);
Pero luego, si haces algo como esto:
list.add(1);
usted obtiene java.lang.UnsupportedOperationException
. Entonces, en algunos casos incluso necesitas esto:
Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));
El primer enfoque en realidad no convierte la matriz sino que la "representa" como un archivo List
. Pero la matriz está bajo el capó con todas sus propiedades, como un número fijo de elementos. Tenga en cuenta que debe especificar el tipo al construir ArrayList
.