将对象数组转换为其基本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();
但是,目前只有int
, long
和double
原始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();