Convertendo uma matriz de objects em uma matriz de seus tipos primitivos

Se você tiver uma matriz de objects Java que tenha um tipo primitivo (por exemplo, Byte, Integer, Char, etc). Existe uma maneira legal de convertê-lo em uma matriz do tipo primitivo? Em particular, isso pode ser feito sem ter que criar uma nova matriz e percorrer o conteúdo.

Então, por exemplo, dado

Integer[] array 

qual é a melhor maneira de converter isso em

 int[] intArray 

Infelizmente, isso é algo que temos que fazer com bastante frequência quando fazemos a interface entre o Hibernate e algumas bibliotecas de terceiros sobre as quais não temos controle. Parece que esta seria uma operação bastante comum, então eu ficaria surpreso se não houvesse nenhum atalho.

Obrigado pela ajuda!

Infelizmente, não há nada na plataforma Java que faça isso. Btw, você também precisa tratar explicitamente null elementos null no array Integer[] (que int você vai usar para aqueles?).

Mais uma vez, o Apache Commons Lang é seu amigo. Eles fornecem ArrayUtils.toPrimitive () que faz exatamente o que você precisa. Você pode especificar como você deseja manipular nulos.

Com streams introduzidos no Java 8 isso pode ser feito:

 int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray(); 

No entanto, existem atualmente apenas streams primitivos para int , long e double . Se você precisar converter para outro tipo primitivo, como byte o caminho mais curto sem uma biblioteca externa é o seguinte:

 byte[] byteArray = new byte[array.length]; for(int i = 0; i < array.length; i++) byteArray[i] = array[i]; 

Ou o loop for pode ser substituído por um stream se você quiser:

 IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]); 

Tudo isso lançará um NullPointerException se algum dos seus elementos for null .

Usando Goiaba :

 int[] intArray = Ints.toArray(Arrays.asList(array)); 

Documentação:

  • Arrays.asList (Core API)
  • Ints.toArray (goiaba)

Em particular, isso pode ser feito sem ter que criar uma nova matriz e percorrer o conteúdo.

Você não pode converter uma matriz de Integer para int (ou seja, você não pode alterar o tipo de elementos de uma matriz) em Java. Portanto, você deve criar um novo array int [] e copiar o valor dos objects Integer para ele ou usar um adaptador:

 class IntAdapter { private Integer[] array; public IntAdapter (Integer[] array) { this.array = array; } public int get (int index) { return array[index].intValue(); } } 

Isso pode tornar seu código um pouco mais legível e o object IntAdapter consumirá apenas alguns bytes de memory. A grande vantagem de um adaptador é que você pode manipular casos especiais aqui:

 class IntAdapter { private Integer[] array; public int nullValue = 0; public IntAdapter (Integer[] array) { this.array = array; } public int get (int index) { return array[index] == null ? nullValue : array[index].intValue(); } } 

Outra solução é usar Primitivas do Commons que contém muitos adaptadores predefinidos. No seu caso, dê uma olhada no ListIntList .

Ou apenas faça da maneira mais fácil se você vai fazer isso apenas uma vez. Mas você não falou sobre Integer! = Null case.

  //array is the Integer array int[] array2 = new int[array.length]; int i=0; for (Integer integer : array) { array2[i] = integer.intValue(); i++; } 

usar o dólar é simples como:

 Integer[] array = ...; int[] primitiveArray = $(array).toIntArray();