如果您有一个具有原始类型(例如Byte,Integer,Char等)的Java对象数组。有没有一种巧妙的方法可以将其转换为原始类型的数组?特别是可以做到这一点,而不必创建新的数组并遍历内容。
因此,例如
Integer[] array
将其转换为最简洁的方法是什么
int[] intArray
不幸的是,在Hibernate和我们无法控制的某些第三方库之间进行接口时,这是我们经常要做的事情。看来这将是一个非常普通的操作,所以如果没有捷径,我会感到惊讶。
谢谢你的帮助!
Answers:
不幸的是,Java平台中没有任何东西可以做到这一点。顺便说一句,您还需要显式处理数组中的null
元素Integer[]
(这些元素int
将用于什么?)。
再次,Apache Commons Lang是您的朋友。他们提供了ArrayUtils.toPrimitive()来满足您的需求。您可以指定要如何处理空值。
使用Java 8中引入的流,可以做到这一点:
int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray();
然而,目前只有基本流int
,long
和double
。如果您需要转换为其他原始类型(例如,byte
没有外部库的最短方法),则如下:
byte[] byteArray = new byte[array.length];
for(int i = 0; i < array.length; i++) byteArray[i] = array[i];
或者,如果需要,可以将for循环替换为流:
IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]);
NullPointerException
如果您的任何元素都为,所有这些都会引发null
。
Integer::intValue
,您还可以使用i -> i
(使用拆箱)。
Integer::intValue
您取消装箱,那么,如果该方法随时可用,为什么还要创建一个新的lambda?
int[] ints = Arrays.stream(objects).mapToInt(i -> Integer.parseInt(i.toString())).toArray();
希望这对遇到相同问题的任何人都有用。如果有人知道更好的方法,请告诉我。
使用番石榴:
int[] intArray = Ints.toArray(Arrays.asList(array));
说明文件:
Arrays.asList
(核心API)Ints.toArray
(番石榴)特别是可以做到这一点,而不必创建新的数组并遍历内容。
您不能在Java中将Integer数组转换为int(即,您不能更改数组元素的类型)。因此,您必须创建一个新的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();
}
}
另一个解决方案是使用Commons Primitives,它包含许多预定义的适配器。在您的情况下,请查看ListIntList。
或者,如果您只做一次,那就以简单的方式做。但是您还没有谈论过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++;
}