Esta puede ser una pregunta un poco fácil, de escritorio, pero mi primer intento sorprendentemente no funcionó. Quería tomar una serie de largos primitivos y convertirlo en una lista, que intenté hacer así:
long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!
¿Cuál es la forma correcta de hacer esto?
java
arrays
collections
boxing
Brandon Yarbrough
fuente
fuente
Respuestas:
He encontrado que es conveniente hacer uso de Apache Commons Lang ArrayUtils ( JavaDoc , Maven dependencia )
también tiene la API inversa
EDITAR: actualizado para proporcionar una conversión completa a una lista según lo sugerido por los comentarios y otras correcciones.
fuente
Arrays.asList(ArrayUtils.toObject(input))
.List<Long> = Arrays.asList(inputBoxed)
en su pregunta, me pareció redundante repetirlo ya que pensé que era obvio, supongo que estaba equivocado ...Desde Java 8 ahora puede usar transmisiones para eso:
fuente
stream
función solo se define paraint[]
,long[]
ydouble[]
.LongStream.of(arr).boxed()...
.Arrays.stream(arr).boxed().collect(Collectors.toList());
Desafortunadamente, esto solo puede regresarList<Object>
fuente
hallidave y jpalecek tienen la idea correcta, iterar sobre una matriz, pero no aprovechan una característica proporcionada por
ArrayList
: dado que el tamaño de la lista se conoce en este caso, debe especificarlo cuando cree elArrayList
.De esta manera, no se crean matrices innecesarias solo para ser descartadas por el
ArrayList
porque resultan ser demasiado cortas, y no se desperdician "ranuras" vacías porqueArrayList
sobrestiman sus requisitos de espacio. Por supuesto, si continúa agregando elementos a la lista, se necesitará una nueva matriz de respaldo.fuente
Un poco más detallado, pero esto funciona:
En su ejemplo, parece que Arrays.asList () está interpretando la entrada como una lista de matrices largas [] en lugar de una lista de Longs. Un poco sorprendente, seguro. El autoboxing simplemente no funciona de la manera deseada en este caso.
fuente
Como otra posibilidad, la biblioteca Guava proporciona esto como
Longs.asList()
, con clases de utilidad similares para los otros tipos primitivos.fuente
No, no hay conversión automática de una matriz de tipo primitivo a una matriz de sus tipos de referencia en caja. Solo puedes hacer
fuente
La pregunta se refería a cómo convertir una matriz en una lista. La mayoría de las respuestas hasta ahora mostraban cómo crear una nueva lista con el mismo contenido que la matriz o referidas a bibliotecas de terceros. Sin embargo, hay opciones simples e integradas para este tipo de conversión. Algunos de ellos ya han sido bosquejados en otras respuestas (por ejemplo, esta ). Pero me gustaría señalar y elaborar ciertos grados de libertad para la implementación aquí, y mostrar los posibles beneficios, inconvenientes y advertencias.
Hay al menos dos distinciones importantes que deben hacerse:
Las opciones se resumirán aquí rápidamente, y se muestra un programa de ejemplo completo al final de esta respuesta.
Crear una nueva lista versus crear una vista en la matriz
Cuando el resultado debe ser una lista nueva , se puede utilizar uno de los enfoques de las otras respuestas:
Pero uno debería considerar los inconvenientes de hacer esto: una matriz con 1000000
long
valores ocupará aproximadamente 8 megabytes de memoria. La nueva lista también ocupará aproximadamente 8 megabytes. Y, por supuesto, la matriz completa debe atravesarse al crear esta lista. En muchos casos, crear una nueva lista simplemente no es necesario. En cambio, es suficiente crear una vista en la matriz:(Vea el ejemplo en la parte inferior para una implementación del
toList
método)La implicación de tener una vista en la matriz es que los cambios en la matriz serán visibles en la lista:
Afortunadamente, crear una copia (es decir, una nueva lista que no se ve afectada por las modificaciones en la matriz) desde la vista es trivial:
Ahora, esta es una copia verdadera, equivalente a lo que se logra con la solución basada en flujo que se mostró arriba.
Crear una vista modificable o una vista no modificable
En muchos casos, será suficiente cuando la lista sea de solo lectura . El contenido de la lista resultante a menudo no se modificará, sino que solo se pasará al procesamiento posterior que solo lee la lista.
Permitir modificaciones de la lista plantea algunas preguntas:
Es posible crear una vista de lista en la matriz que sea modificable . Esto significa que los cambios en la lista, como establecer un nuevo valor en un cierto índice, serán visibles en la matriz.
Pero no es posible crear una vista de lista que sea estructuralmente modificable . Esto significa que no es posible realizar operaciones que afecten el tamaño de la lista. Esto es simplemente porque el tamaño de la matriz subyacente no se puede cambiar.
El siguiente es un MCVE que muestra las diferentes opciones de implementación y las posibles formas de usar las listas resultantes:
La salida del ejemplo se muestra aquí:
fuente
Otra forma con Java 8.
fuente
Estoy escribiendo una pequeña biblioteca para estos problemas:
En caso de que te interese, compruébalo aquí .
fuente
Otra forma con Java 8.
fuente
Arrays.stream(a).boxed().collect(Collectors.<Long>toList());
Combinando las respuestas de Pavel y Tom, obtenemos esto
fuente
Si desea una semántica similar
Arrays.asList
, deberá escribir (o utilizar la implementación de cliente de otra persona)List
(probablemente a través de)AbstractList
. Debería tener una implementación muy similar aArrays.asList
, solo valores de caja y caja.fuente
Puedes usar transmorph :
También funciona si la fuente es una matriz de entradas, por ejemplo.
fuente
Sé que esta pregunta es lo suficientemente antigua, pero ... también puedes escribir tu propio método de conversión:
Después de incluirlo mediante la importación estática, los posibles usos podrían ser:
o
fuente
catch (ArrayIndexOutOfBoundsException ex) { /* Finished getting array elements */ }
eres una persona terrible.Si bien es posible crear una nueva Lista y agregarle todos los valores (a través de bucles o secuencias), he estado trabajando en matrices realmente grandes y obtengo un rendimiento deficiente. Por lo tanto, creé mi propia clase de contenedor de matriz primitiva fácil de usar.
Ejemplo:
Consíguelo aquí: https://github.com/Sf298/Sauds-Toolbox/blob/master/src/main/java/PrimitiveArrayWrapper/PrimitiveList.java
NOTA: Todavía no lo he probado completamente, así que avíseme si encuentra algún error / problema.
fuente
Puedes usar
LongStream
para esofuente