Estou tentando converter um ArrayList contendo objetos Inteiros para int primitivo] com o seguinte pedaço de código, mas está lançando um erro de tempo de compilação. É possível converter em Java?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
java
arrays
arraylist
primitive-types
Snehal
fonte
fonte
List<Integer> x = new ArrayList<Integer>();
Integer[] n = x.toArray(new Integer[0]);
Respostas:
Você pode converter, mas acho que não há nada incorporado para fazer isso automaticamente:
(Observe que isso lançará uma NullPointerException se um
integers
ou qualquer elemento dele fornull
.)EDIT: conforme os comentários, convém usar o iterador da lista para evitar custos desagradáveis com listas como
LinkedList
:fonte
integers.stream().mapToInt(Integer::valueOf).toArray
Se você estiver usando java-8 também há outra maneira de fazer isso.
O que ele faz é:
Stream<Integer>
da listaIntStream
mapeando cada elemento para si mesmo (função de identidade), descompactando oint
valor retido por cadaInteger
objeto (feito automaticamente desde o Java 5)int
chamandotoArray
Você também pode chamar explicitamente
intValue
através de uma referência de método, ou seja:Também vale a pena mencionar que você pode obter um
NullPointerException
se tiver algumanull
referência na lista. Isso pode ser facilmente evitado adicionando uma condição de filtragem ao pipeline de fluxo como este:Exemplo:
fonte
double
tipos; não há equivalente parafloat
tipos?Google Guava
O Google Guava fornece uma maneira elegante de fazer isso ligando
Ints.toArray
.fonte
O Apache Commons possui uma classe ArrayUtils, que possui um método toPrimitive () que faz exatamente isso.
No entanto, como Jon mostrou, é muito fácil fazer isso sozinho, em vez de usar bibliotecas externas.
fonte
Acredito que iterar usando o iterador da Lista é uma idéia melhor, pois
list.get(i)
pode ter um desempenho ruim, dependendo da implementação da Lista:fonte
usar Dollar deve ser bastante simples:
Estou planejando melhorar o DSL para remover a
toArray()
chamada intermediáriafonte
Isso funciona bem para mim :)
Encontrado em https://www.techiedelight.com/convert-list-integer-array-int/
fonte
Surpreende-me que incentivemos métodos personalizados únicos sempre que uma biblioteca perfeitamente boa e bem usada, como o Apache Commons, já resolveu o problema. Embora a solução seja trivial, se não absurda, é irresponsável incentivar esse comportamento devido à manutenção e acessibilidade a longo prazo.
Basta ir com o Apache Commons
fonte
Se você estiver usando Coleções Eclipse , poderá usar o
collectInt()
método para alternar de um contêiner de objeto para um contêiner int primitivo.Se você pode converter seu
ArrayList
em umFastList
, pode se livrar do adaptador.Nota: Sou responsável por coleções do Eclipse.
fonte
Java 8:
fonte
Arrays.setAll ()
Resultado:
O mesmo vale para uma matriz de
long
oudouble
, mas não para matrizes deboolean
,char
,byte
,short
oufloat
. Se você tem uma lista realmente grande, há até umparallelSetAll
método que você pode usar.Para mim, isso é bom e elegante o suficiente para que eu não queira obter uma biblioteca externa nem usar fluxos para ela.
Link da documentação:
Arrays.setAll(int[], IntUnaryOperator)
fonte
Você pode simplesmente copiá-lo para uma matriz:
Não é muito chique; mas, ei, funciona ...
fonte
Uma solução simples de uma linha é:
fonte
Este segmento de código está funcionando para mim, tente o seguinte:
Vale mencionar que ArrayList deve ser declarado assim:
fonte
fonte
acesso
arr
como normalint[]
.fonte