Java 将对象数组转换为其基本类型的数组

Java 将对象数组转换为其基本类型的数组,java,arrays,primitive-types,Java,Arrays,Primitive Types,如果您有一个具有基元类型(例如Byte、Integer、Char等)的Java对象数组。有并没有一种简洁的方法可以将其转换为基元类型的数组?特别是,无需创建新数组并循环内容即可完成此操作 例如,给定 Integer[] array 将其转换为最简洁的方式是什么 int[] intArray 不幸的是,当在Hibernate和一些我们无法控制的第三方库之间进行接口时,我们必须经常这样做。这似乎是一个非常常见的操作,所以如果没有捷径,我会感到惊讶 谢谢你的帮助 不幸的是,Java平台中没有这样做

如果您有一个具有基元类型(例如Byte、Integer、Char等)的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)
  • (番石榴)
在Java 8中引入了以下功能:

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]);