Java 将对象数组转换为其基本类型的数组
如果您有一个具有基元类型(例如Byte、Integer、Char等)的Java对象数组。有并没有一种简洁的方法可以将其转换为基元类型的数组?特别是,无需创建新数组并循环内容即可完成此操作 例如,给定Java 将对象数组转换为其基本类型的数组,java,arrays,primitive-types,Java,Arrays,Primitive Types,如果您有一个具有基元类型(例如Byte、Integer、Char等)的Java对象数组。有并没有一种简洁的方法可以将其转换为基元类型的数组?特别是,无需创建新数组并循环内容即可完成此操作 例如,给定 Integer[] array 将其转换为最简洁的方式是什么 int[] intArray 不幸的是,当在Hibernate和一些我们无法控制的第三方库之间进行接口时,我们必须经常这样做。这似乎是一个非常常见的操作,所以如果没有捷径,我会感到惊讶 谢谢你的帮助 不幸的是,Java平台中没有这样做
Integer[] array
将其转换为最简洁的方式是什么
int[] intArray
不幸的是,当在Hibernate和一些我们无法控制的第三方库之间进行接口时,我们必须经常这样做。这似乎是一个非常常见的操作,所以如果没有捷径,我会感到惊讶
谢谢你的帮助 不幸的是,Java平台中没有这样做的东西。顺便说一句,您还需要显式处理
Integer[]
数组中的null
元素(这些元素将使用什么int
)
特别是,无需创建新数组并循环内容即可完成此操作
在Java中,不能将整数数组转换为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();
}
}
另一个解决方案是使用包含大量预定义适配器的。在你的情况下,看看。或者如果你只想做一次,就用简单的方法来做。但你还没提到整数=空格
//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();
使用:
文件:
- (核心API)
- (番石榴)
int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray();
但是,目前只有int
、long
和double
的基本流。如果需要转换为另一种基本类型,如字节
,则无需外部库的最短方法如下:
byte[] byteArray = new byte[array.length];
for(int i = 0; i < array.length; i++) byteArray[i] = array[i];
如果您的任何元素都是
null
空值,所有这些都将抛出NullPointerException
。出于我的目的,如果其中一个条目为null,我会接受引发的异常,这与取消绑定对象时引发NullPointerException的方式相同。对于Java 8,这个答案不再准确,请参阅。这似乎不是Java,至少不是Java 1.6或1.7。@LorDalCol Dollar实际上是一个Java库它可以命名一个Java方法$
!我不认为这是鼓励的,但是…除了Integer::intValue
,你还可以使用I->I
(它使用取消装箱)。@robinst和取消装箱是编译器为你调用Integer::intValue
,那么为什么要创建一个新的lambda,当这个方法随时可用时?@Andreas刚刚列出了另一个选项,您选择哪一个是代码风格/个人偏好的问题。我还对这两种方法进行了微基准标记(使用JMH),它们具有相同的性能。使用发布的第一个代码段会给我一个“不能在静态上下文中使用非静态方法”错误,所以我改为:int[]ints=Arrays.stream(objects.mapToInt(I->Integer.parseInt(I.toString()).toArray()代码>希望这对有相同问题的人有帮助。如果有人知道更好的方法,请告诉我。这应该是当今公认的答案。谢谢你,亚历克斯。
byte[] byteArray = new byte[array.length];
for(int i = 0; i < array.length; i++) byteArray[i] = array[i];
IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]);