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

时间:2009-02-19 08:26:50

标签: java arrays primitive-types

如果您有一个具有基本类型的Java对象数组(例如Byte,Integer,Char等)。有没有一种简洁的方法我可以将它转换为原始类型的数组?特别是可以在不必创建新数组并遍历内容的情况下完成此操作。

例如,给定

Integer[] array

将此转换为

的最佳方法是什么?
int[] intArray

不幸的是,当Hibernate与我们无法控制的某些第三方库之间进行交互时,我们必须经常这样做。这似乎是一个非常常见的操作,所以如果没有捷径我会感到惊讶。

感谢您的帮助!

8 个答案:

答案 0 :(得分:88)

再一次,Apache Commons Lang是你的朋友。他们提供ArrayUtils.toPrimitive(),它完全符合您的需要。您可以指定处理空值的方式。

答案 1 :(得分:57)

在Java 8中引入streams,可以这样做:

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

但是,目前只有intlongdouble的原始流。如果您需要转换为另一种原始类型,例如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

答案 2 :(得分:37)

不幸的是,Java平台中没有任何内容可以做到这一点。顺便说一下,你还需要明确处理null数组中的Integer[]个元素(那些int会用于那些?)。

答案 3 :(得分:24)

使用Guava

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

文档:

答案 4 :(得分:3)

  

特别是可以在不必创建新数组并遍历内容的情况下完成此操作。

您无法在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

答案 5 :(得分:2)

如果你只做一次,那么就这么简单。但你还没有谈到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++;
    }

答案 6 :(得分:1)

使用Dollar很简单:

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

答案 7 :(得分:0)

这是所有原始类型的通用解决方案

/**
 * Convert Collection to equivalent array of primitive type
 * @param <S> [in] Object type of source collection
 * @param tcls [in] class of the primitive element
 * @param q [in] source collection
 * @return Equivalent Array of tcls-elements, requires cast to "tcls"[]
 */
public static <S> Object asPrimitiveArray(Class<?> tcls, Collection<S> q)
{
    int n = q.size();
    Object res = Array.newInstance(tcls, n);
    Iterator<S> i = q.iterator();
    int j = 0;
    while (i.hasNext())
    {
        Array.set(res, j++, i.next());
    }
    return res;
}

/**
 * Convert Object array to equivalent array of primitive type
 * @param <S> [in] Object type of source array
 * @param tcls [in] class of the primitive element
 * @param s [in] source array
 * @return Equivalent Array of tcls-elements, requires cast to "tcls"[]
 */
public static <S> Object asPrimitiveArray(Class<?> tcls, S[] s)
{
    return asPrimitiveArray(tcls, Arrays.asList(s));
} 

整数到整数的转换

Integer[] a = ...
int[] t = (int[]) asPrimitiveArray(int.class, a);