Isso pode ser um pouco fácil, tipo de pergunta na mesa, mas minha primeira tentativa surpreendentemente falhou completamente no trabalho. Eu queria pegar uma matriz de longos primitivos e transformá-lo em uma lista, que tentei fazer assim:
long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!
Qual é o caminho certo para fazer isso?
java
arrays
collections
boxing
Brandon Yarbrough
fonte
fonte
Respostas:
Achei conveniente usar o apache commons lang ArrayUtils ( JavaDoc , dependência do Maven )
ele também tem a API reversa
EDIT: atualizado para fornecer uma conversão completa em uma lista, conforme sugerido por comentários e outras correções.
fonte
Arrays.asList(ArrayUtils.toObject(input))
provavelmente.List<Long> = Arrays.asList(inputBoxed)
em sua pergunta que eu achei redundante repeti-la como eu pensei que era óbvio, eu acho que eu estava errado ...Desde o Java 8, agora você pode usar fluxos para isso:
fonte
stream
função é definida apenas paraint[]
,long[]
edouble[]
.LongStream.of(arr).boxed()...
.Arrays.stream(arr).boxed().collect(Collectors.toList());
Infelizmente isso só pode voltar #List<Object>
fonte
hallidave e jpalecek têm a idéia certa - iterando sobre uma matriz - mas não tiram vantagem de um recurso fornecido por
ArrayList
: como o tamanho da lista é conhecido nesse caso, você deve especificá-lo quando criar oArrayList
.Dessa forma, nenhuma matriz desnecessária é criada apenas para ser descartada pelo
ArrayList
porque ela é muito curta e nenhum "slot" vazio é desperdiçado porqueArrayList
superestimou seus requisitos de espaço. Obviamente, se você continuar adicionando elementos à lista, será necessária uma nova matriz de apoio.fonte
Um pouco mais detalhado, mas isso funciona:
No seu exemplo, parece que Arrays.asList () está interpretando a entrada como lista de matrizes longas [] em vez de uma lista de Longs. Um pouco surpreendente, com certeza. A autoboxing simplesmente não funciona da maneira que você deseja neste caso.
fonte
Como outra possibilidade, a biblioteca Guava fornece isso como
Longs.asList()
, com classes de utilidade semelhantes para os outros tipos primitivos.fonte
Não, não há conversão automática de matriz do tipo primitivo para matriz de seus tipos de referência em caixa. Você só pode fazer
fonte
A pergunta foi feita sobre como transformar uma matriz em uma lista. Até agora, a maioria das respostas mostrou como criar uma nova lista com o mesmo conteúdo da matriz ou referir-se a bibliotecas de terceiros. No entanto, existem opções simples e integradas para esse tipo de conversão. Alguns deles já foram esboçados em outras respostas (por exemplo, esta ). Mas eu gostaria de salientar e elaborar certos graus de liberdade para a implementação aqui e mostrar os possíveis benefícios, desvantagens e advertências.
Há pelo menos duas distinções importantes a serem feitas:
As opções serão resumidas aqui rapidamente, e um programa de exemplo completo é mostrado na parte inferior desta resposta.
Criando uma nova lista versus criando uma exibição na matriz
Quando o resultado deve ser uma nova lista, uma das abordagens das outras respostas pode ser usada:
Mas deve-se considerar as desvantagens de fazer isso: uma matriz com
long
valores de 1000000 ocupará aproximadamente 8 megabytes de memória. A nova lista também ocupará cerca de 8 megabytes. E, claro, a matriz completa deve ser percorrida ao criar esta lista. Em muitos casos, a criação de uma nova lista simplesmente não é necessária. Em vez disso, é suficiente criar uma exibição na matriz:(Veja o exemplo na parte inferior para uma implementação do
toList
método)A implicação de ter uma visualização na matriz é que as alterações na matriz serão visíveis na lista:
Felizmente, a criação de uma cópia (ou seja, uma nova lista que não é afetada por modificações na matriz) a partir da exibição é trivial:
Agora, esta é uma cópia verdadeira, equivalente ao que é alcançado com a solução baseada em fluxo que foi mostrada acima.
Criando uma visão modificável ou uma visão não modificável
Em muitos casos, será suficiente quando a lista for somente leitura . O conteúdo da lista resultante geralmente não será modificado, mas passado apenas para o processamento downstream que apenas lê a lista.
Permitir modificações da lista levanta algumas questões:
É possível criar uma exibição de lista na matriz que seja modificável . Isso significa que as alterações na lista, como definir um novo valor em um determinado índice, serão visíveis na matriz.
Mas não é possível criar uma exibição de lista estruturalmente modificável . Isso significa que não é possível executar operações que afetam o tamanho da lista. Isso ocorre simplesmente porque o tamanho da matriz subjacente não pode ser alterado.
A seguir, é apresentado um MCVE, mostrando as diferentes opções de implementação e as possíveis maneiras de usar as listas resultantes:
A saída do exemplo é mostrada aqui:
fonte
Outra maneira com o Java 8.
fonte
Estou escrevendo uma pequena biblioteca para esses problemas:
Caso você se preocupe, verifique aqui .
fonte
Outra maneira com o Java 8.
fonte
Arrays.stream(a).boxed().collect(Collectors.<Long>toList());
Combinando as respostas de Pavel e Tom, obtemos isso
fonte
Se você deseja uma semântica semelhante
Arrays.asList
, precisará escrever (ou usar a implementação de outra pessoa) do clienteList
(provavelmente através delaAbstractList
. Ele deve ter a mesma implementação queArrays.asList
apenas valores de caixa e unbox.fonte
Você pode usar o transmorph :
Também funciona se fonte é uma matriz de entradas, por exemplo.
fonte
Eu sei que esta pergunta é antiga o suficiente, mas ... você também pode escrever seu próprio método de conversão:
Depois de incluí-lo usando a importação estática, os usos possíveis podem ser:
ou
fonte
catch (ArrayIndexOutOfBoundsException ex) { /* Finished getting array elements */ }
você é uma pessoa terrível.Embora seja possível criar uma nova lista e adicionar todos os valores a ela (via loop ou fluxos), tenho trabalhado em matrizes realmente grandes e obtém desempenho ruim. Portanto, criei minha própria classe de wrapper de matriz primitiva fácil de usar.
Exemplo:
Obtenha aqui: https://github.com/Sf298/Sauds-Toolbox/blob/master/src/main/java/PrimitiveArrayWrapper/PrimitiveList.java
OBSERVAÇÃO: ainda não o testei completamente, informe-me se encontrar algum erro / problema.
fonte
Você pode usar
LongStream
para issofonte