将对象数组转换为其基本types的数组

如果您有一个具有原始types(例如Byte,Integer,Char等)的Java对象数组。 有没有一种整洁的方式,我可以将其转换为原始types的数组? 特别是可以做到这一点,而不必创build一个新的数组,并通过内容循环。

举个例子,给出

Integer[] array 

什么是最好的方式来转换成这个

 int[] intArray 

不幸的是,在Hibernate和我们无法控制的第三方库之间进行接口时,这是我们必须经常做的事情。 看来这将是一个相当常见的操作,所以如果没有捷径,我会感到惊讶。

谢谢你的帮助!

不幸的是,Java平台没有这样做。 顺便说一句,你还需要显式处理Integer[]数组中的null元素(你将使用什么int ?)。

Apache Commons Lang再一次是你的朋友。 他们提供ArrayUtils.toPrimitive() ,这正是你所需要的。 你可以指定你想如何处理空值。

在Java 8中引入的stream可以这样做:

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

但是,目前只有intlongdouble原始stream。 如果你需要转换为另一种基本types如byte ,最简单的方法是不需要外部库:

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

或者,如果你想要的话for循环可以用一个stream代替:

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

所有这些将抛出一个NullPointerException如果你的任何元素为null

使用番石榴 :

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

文档:

  • Arrays.asList (核心API)
  • Ints.toArray (番石榴)

特别是可以做到这一点,而不必创build一个新的数组,并通过内容循环。

你不能在Java中把一个Integer数组转换成int(即你不能改变一个数组元素的types)。 因此,您必须创build一个新的int []数组并将Integer对象的值复制到其中,否则您可以使用适配器:

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

这可以使您的代码更具可读性,并且IntAdapter对象将只消耗几个字节的内存。 适配器的一大优点是可以在这里处理特殊情况:

 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(); } } 

另一个解决scheme是使用包含许多预定义适配器的Commons Primitives 。 在你的情况下,看看ListIntList 。

或者如果你只做一次就简单的做。 但是你还没有谈到Integer!= null的情况。

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

使用美元很简单,因为:

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