Como faço para converter uma matriz em uma lista em Java?
Eu usei o Arrays.asList()
mas o comportamento (e assinatura) mudou de alguma forma do Java SE 1.4.2 (documentos agora em archive) para 8 e a maioria dos trechos que encontrei na Web usam o comportamento 1.4.2.
Por exemplo:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
- no 1.4.2 retorna uma lista contendo os elementos 1, 2, 3
- em 1.5.0+ retorna uma lista contendo o spam da matriz
Em muitos casos, deve ser fácil detectar, mas às vezes pode passar despercebido:
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
java
arrays
list
data-conversion
Alexandru
fonte
fonte
Arrays.asList(new int[] { 1, 2, 3 })
:; definitivamente não compilou no Java 1.4.2, porque um nãoint[]
é um .Object[]
Arrays.asList
deve funcionar.Respostas:
No seu exemplo, é porque você não pode ter uma lista de um tipo primitivo. Em outras palavras,
List<int>
não é possível.No entanto, você pode
List<Integer>
usar aInteger
classe que agrupa oint
primitivo. Converta sua matriz em umList
com oArrays.asList
método utilitárioVeja este código executado ao vivo em IdeOne.com .
fonte
List<Integer[]>
?Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
No Java 8, você pode usar fluxos:
fonte
boolean[]
. Eu acho que é porque é tão fácil fazer umBoolean[]
. Essa é provavelmente uma solução melhor. Enfim, é uma peculiaridade interessante.Falando sobre a maneira de conversão, depende de por que você precisa do seu
List
. Se você precisar apenas para ler dados. OK, aqui vai você:Mas se você fizer algo assim:
você recebe
java.lang.UnsupportedOperationException
. Então, para alguns casos, você ainda precisa disso:A primeira abordagem, na verdade, não converte a matriz, mas a 'representa' como a
List
. Mas a matriz está oculta com todas as suas propriedades, como número fixo de elementos. Observe que você precisa especificar o tipo ao construirArrayList
.fonte
O problema é que os varargs foram introduzidos no Java5 e, infelizmente, também
Arrays.asList()
foram sobrecarregados com uma versão do vararg. AssimArrays.asList(spam)
, o compilador Java5 é entendido como um parâmetro vararg de matrizes int.Esse problema é explicado em mais detalhes no Java Efetivo 2º Ed., Capítulo 7, Item 42.
fonte
Parece um pouco tarde, mas aqui estão meus dois centavos. Não podemos ter
List<int>
comoint
é um tipo primitivo, por isso só podemos terList<Integer>
.Java 8 (matriz int)
Java 8 e abaixo (matriz inteira)
Precisa ArrayList e não List?
Caso desejemos uma implementação específica de,
List
por exemploArrayList
, podemos usartoCollection
como:Por
list21
que não pode ser estruturalmente modificado?Quando usamos
Arrays.asList
o tamanho da lista retornada, é corrigido porque a lista retornada não éjava.util.ArrayList
, mas uma classe estática privada definida dentrojava.util.Arrays
. Portanto, se adicionarmos ou removermos elementos da lista retornada, umUnsupportedOperationException
será lançado. Portanto, devemos prosseguirlist22
quando queremos modificar a lista. Se tivermos o Java8, também podemos usarlist23
.Para ser claro,
list21
pode ser modificado no sentido que podemos chamar,list21.set(index,element)
mas esta lista não pode ser estruturalmente modificada, ou seja, não pode adicionar ou remover elementos da lista. Você também pode verificar esta pergunta .Se queremos uma lista imutável, podemos agrupá-la como:
Outro ponto a ser observado é que o método
Collections.unmodifiableList
retorna uma visão inalterável da lista especificada. Uma coleção de visualizações não modificáveis é uma coleção que não pode ser modificada e também é uma exibição em uma coleção de suporte. Observe que as alterações na coleção de backup ainda podem ser possíveis e, se ocorrerem, serão visíveis na visualização não modificável.Podemos ter uma lista realmente imutável no Java 9 e 10.
Lista verdadeiramente imutável
Java 9:
Java 10 (lista verdadeiramente imutável) de duas maneiras:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
Verifique também esta minha resposta para mais.
fonte
List::add
eList::remove
falhar com uma lista retornada porArrays.asList
. O JavaDoc para esse método está mal escrito e não é claro neste ponto. Na minha terceira leitura, suponho que a frase "tamanho fixo" pretendesse dizer que não se pode adicionar ou remover elementos.Ainda mais curto:
fonte
Recentemente, tive que converter uma matriz em uma lista. Posteriormente, o programa filtrou a lista tentando remover os dados. Ao usar a função Arrays.asList (matriz), você cria uma coleção de tamanho fixo: não é possível adicionar nem excluir. Esta entrada explica o problema da melhor maneira possível: Por que recebo uma UnsupportedOperationException ao tentar remover um elemento de uma Lista? .
No final, eu tive que fazer uma conversão "manual":
Suponho que eu poderia ter adicionado a conversão de uma matriz para uma lista usando uma operação List.addAll (itens).
fonte
new ArrayList<ListItem>(Arrays.asList(itemsArray))
iria para o mesmoCollections.addAll(items, itemsArray)
lugar.Usando matrizes
Essa é a maneira mais simples de converter uma matriz em
List
. No entanto, se você tentar adicionar um novo elemento ou remover um elemento existente da lista, umUnsupportedOperationException
será lançado.Usando ArrayList ou outras implementações de lista
Você pode usar um
for
loop para adicionar todos os elementos da matriz em umList
implementação, por exemploArrayList
:Usando a API de Stream no Java 8
Você pode transformar a matriz em um fluxo e coletá-lo usando diferentes coletores: O coletor padrão no Java 8 usa
ArrayList
atrás da tela, mas também pode impor sua implementação preferida.Veja também:
fonte
Outra solução alternativa se você usar o apache commons-lang:
Onde ArrayUtils.toObject converte
int[]
emInteger[]
fonte
você tem que usar a matriz
fonte
Uma linha:
fonte
No Java 9, você tem a solução ainda mais elegante de usar listas imutáveis por meio do novo método de fábrica de conveniência
List.of
:(copiado descaradamente a partir daqui )
fonte
Se você está direcionando o Java 8 (ou posterior), pode tentar o seguinte:
NOTA:
Preste atenção ao
Collectors.<Integer>toList()
, esse método genérico ajuda a evitar o erro "Incompatibilidade de tipo: não é possível converter deList<Object>
paraList<Integer>
".fonte
Usando a goiaba:
Usando coleções do Apache Commons:
fonte
Se isso ajuda: Eu tive o mesmo problema e simplesmente escrevi uma função genérica que pega uma matriz e retorna um ArrayList do mesmo tipo com o mesmo conteúdo:
fonte
Matriz fornecida:
Convertendo matriz inteira em Lista inteira
Uma maneira: boxed () -> retorna o IntStream
Segunda maneira: mapeie cada elemento do fluxo para Inteiro e depois colete
NOTA: Usando o mapToObj, você pode ocultar cada elemento int no fluxo de strings, no fluxo de caracteres, etc., encaixando i em (char) i
Convertendo um tipo de matriz em outro tipo Exemplo:
fonte
Portanto, depende da versão do Java que você está tentando.
Java 7
OU
OU
No Java 8
Referência - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/
fonte
Você pode melhorar esta resposta, por favor, pois é isso que eu uso, mas não estou 100% claro. Funciona bem, mas a inteligência adicionou uma nova WeatherStation [0]. Por que o 0?
fonte
use duas linhas de código para converter a matriz em lista. Se você a usar em valor inteiro, deverá usar o tipo de caixa automática para o tipo de dados primitivo
fonte